From: "Ivan A. Melnikov" <iv@altlinux.org> To: devel-newbies@lists.altlinux.org Subject: Re: [newbies] Q: Git (repack, gc, fsck) Date: Sun, 1 Aug 2010 11:35:44 +0400 Message-ID: <20100801113544.6524183c@deimos.localdomain> (raw) In-Reply-To: <AANLkTinLCpLLgTEhJQ0VhiF82yU9c9Ck53XXodse2p4k@mail.gmail.com> В Sat, 31 Jul 2010 23:16:24 +0700 Slava Semushin <slava.semushin@gmail.com> пишет: > Здравствуйте! Здравствуйте. > К сожалению, не очень представляю себе как работают, что делают и чем > полезны команды git -- repack, gc и fsck. [...] Расскажу, как я это понимаю. == Немного теории == Как известно, git внутри хранит данные в виде объектов нескольких типов (blob, tree, commit, tag). Изначально эти объекты хранятся в файлах, названных по SHA-сумме этого объекта, внутри .git/objects. Для большей эффективности несколько объектов могут быть объединены в один pack. Там, помимо обычного сжатия, используется delta-compression, для эффективного хранения одинаковых или мало отличающихся кусков различных объектов (даже логически не связанных), поэтому хорошо перепаковав репозиторий можно сэкономить много дискового пространства. Интересующихся подробностями используемых алгоритмов всё-таки отошлю, например, к git.git/Documentation/technical/pack-heuristics.txt -- 18 килобайт английских букв, манера изложения забавна, даже перевести захотелось. == git repack == Его задача, как прямо указывает man, объединять объекты в pack'и, а также объединять несколько pack'ов в один. Что хорошо, выполнять его можно довольно смело, он не теряет информацию. Что плохо, при неаккуратном использовании размер репозитория может даже возрасти. Пример аккуратного использования: $ du -s . 940K . $ git repack Counting objects: 76, done. Delta compression using up to 2 threads. Compressing objects: 100% (62/62), done. Writing objects: 100% (76/76), done. Total 76 (delta 37), reused 0 (delta 0) $ du -s . 964K . $ git prune-packed $ du -s . 400K . git prune-packed удалил из .git/objects те объекты, которые присутствуют в запакованном виде. То есть, после git repack некоторые объекты присутствовали как сами по себе, так и внутри pack'а. Другой удачный пример -- команда $ git repack -a -d -f --window=200 --depth=200 неоднократно экономила мне много места для таких огромных репозиториев, как ядро или qt, до того как я узнал про git gc --aggressive. == git gc == Довольно "высокоуровневая" команда, которую рекомендуют запускать периодически, чтобы не давать репозиторию слишком разрастаться. Помимо запаковки новых объектов тем же git repack, выполняет несколько дополнительных действий, например удаляет недоступные (unreachable) объекты (как сборщики мусора во многих языках программирования). То есть, если вы часто делатете git rebase --hard, а потом хватаетесь за голову, используйте git gc с осторожностью. Хотя, по умолчанию, у Вас всё равно есть 30 дней, чтобы за эту самую голову схватиться: недоступные commit'ы удаляются не сразу. В остальных случаях эта команда, вроде бы, ничего страшного делать не должна. Ещё есть вариант использования $ git gc --aggressive который рекомендуется всем, кто хочет сэкономить место на жестком диске, но побаивается (как я) тонкостей git repack. It just does the right thing (чаще всего). == git fsck == Проверяет целостность репозитория. В принципе, никаких изменений не вносит, но позволяет получить некоторую информацию. В частности, может показать: - объекты, которые присутствуют, но нигде напрямую не используются; - объекты, которые не присутствуют, но используются (имеются ссылки на них); - объекты, sha1-сумма которых не верна (не соответствует имени). git fsck полезна, например, после того, как Вы схватитесь за голову после git rebase --hard. По крайней мере, у меня был один такой случай... == Disclaimer == Ещё раз повторюсь, что это моё понимание, и оно может быть неверным в некоторых деталях. Или в принципе неверным =). Надеюсь, получилось не слишком мутно, и я помог больше, чем запутал. -- WBR, Ivan A. Melnikov
next prev parent reply other threads:[~2010-08-01 7:35 UTC|newest] Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top 2010-07-31 16:16 Slava Semushin 2010-07-31 19:58 ` Artem Zolochevskiy 2010-07-31 20:23 ` Andrey Rahmatullin 2010-08-01 7:35 ` Ivan A. Melnikov [this message] 2010-08-01 13:43 ` Slava Semushin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20100801113544.6524183c@deimos.localdomain \ --to=iv@altlinux.org \ --cc=devel-newbies@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
devel@ where you _can_ ask This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel-newbies/0 devel-newbies/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel-newbies devel-newbies/ http://lore.altlinux.org/devel-newbies \ devel-newbies@lists.altlinux.org devel-newbies@lists.altlinux.ru devel-newbies@lists.altlinux.com public-inbox-index devel-newbies Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel-newbies AGPL code for this site: git clone https://public-inbox.org/public-inbox.git