devel@ where you _can_ ask
 help / color / mirror / Atom feed
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


  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