git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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
 
Previous: Jeff KingNext: Jeff King
Message 3 of 6 in “Odd problems trying to build an orphaned branch”
  1. alan@clueserver.orgNov 5, 2015
  2. Jeff KingNov 6, 2015
  3. Jeff KingNov 6, 2015
  4. filter-branch: skip index read/write when possibleJeff King, Nov 6, 2015
  5. alan@clueserver.orgNov 6, 2015
  6. Jeff KingNov 6, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.