Re: git filter-branch should run git gc --auto
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jan 23, 2008, 02:52 UTC
- Message-ID
- <7vwsq1p82i.fsf@gitster.siamese.dyndns.org>
- In-Reply-To
- <7v1w89qmw3.fsf@gitster.siamese.dyndns.org>
Junio C Hamano <gitster@pobox.com> writes:
Show 13 quoted lines
> Kevin Ballard <kevin@sb.org> writes: > >> I just glanced at git-filter-branch.sh (and I must say I was >> incredibly surprised to find out it was a shell script) and it seems >> it never runs git-gc or git-repack. Doesn't that end up with the same >> problems as git-svn sans git-repack when filtering a large number of >> commits? I was just thinking, if I were to git-filter-branch on my >> massive repo (in fact, the same repo that started this thread, with >> over 33000 commits in the upstream svn repo), even if I just do >> something as simple as change the commit msg wont I end up with >> thousands of unreachable objects? I shudder to think how many >> unreachable objects I would have if I pruned the entire dports >> directory off of the tree.
Another thing I forgot to say in my previous message. The old refs are kept in reflogs and also in refs/original/, so you will not be creating new unreachables even if you rewrite many objects.
Show 16 quoted lines
>> Am I missing something, or does git-filter-branch really not do any >> garbage collection? I tried reading the source, but complex bash >> scripts are almost as bad as perl in terms of readability. > > Theoretically yes, and it largely depends on what you do, but > filter-branch goes over the objects that already exists in your > repository, and hopefully you won't be rewriting majority of > them. > > So the impact of not repacking is probably much less painful in > practice. > > But again as I said, it largely depends on what you do in your > filter. If you are upcasing (or convert to NFD ;-)) the > contents of all of your blob objects, you would certainly want > to repack every once in a while.
Something like this, perhaps?
git-filter-branch.sh | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/git-filter-branch.sh b/git-filter-branch.sh index ebf05ca..8e44001 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -299,6 +299,12 @@ while read commit parents; do die "msg filter failed: $filter_msg" sh -c "$filter_commit" "git commit-tree" \ $(git write-tree) $parentstr < ../message > ../map/$commit + + if test $(( $i % 512 )) = 0 + then + git gc --auto + fi + done <../revs # In case of a subdirectory filter, it is possible that a specified head