Re: Odd problems trying to build an orphaned branch
- From
Jeff King <peff@peff.net>
- Date
- Nov 6, 2015, 00:20 UTC
- Message-ID
- <20151106002048.GC9963@sigill.intra.peff.net>
- In-Reply-To
- <20151106001832.GB9963@sigill.intra.peff.net>
On Thu, Nov 05, 2015 at 07:18:32PM -0500, Jeff King wrote:
> Of course that leaves only the problem that filter-branch is > horrendously slow (for the kernel, most of the time goes to populating > the index for each commit; I think filter-branch could probably learn to > skip this step if there is no index or tree filter at work).
Here's a totally untested patch that seems to make a filter-branch like this on the kernel orders of magnitude faster:
diff --git a/git-filter-branch.sh b/git-filter-branch.sh index 27c9c54..9df5185 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -306,6 +306,13 @@ then start_timestamp=$(date '+%s') fi +if test -n "$filter_index" || test -n "$filter_tree" +then + need_index=t +else + need_index= +fi + while read commit parents; do git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1)) @@ -313,7 +320,10 @@ while read commit parents; do case "$filter_subdir" in "") - GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit + if test -n "$need_index" + then + GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit + fi ;; *) # The commit may not have the subdirectory at all @@ -387,8 +397,15 @@ while read commit parents; do } <../commit | eval "$filter_msg" > ../message || die "msg filter failed: $filter_msg" + + if test -n "$need_index" + then + tree=$(git write-tree) + else + tree="$commit^{tree}" + fi workdir=$workdir @SHELL_PATH@ -c "$filter_commit" "git commit-tree" \ - $(git write-tree) $parentstr < ../message > ../map/$commit || + "$tree" $parentstr < ../message > ../map/$commit || die "could not write rewritten commit" done <../revs