[PATCH 1/1] subtree: fix cache_set failure on commit reachable by multiple paths
From: Roland Conybeare <hidden>
Date: 2026-05-24 21:24:08
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Roland Conybeare <hidden>
Date: 2026-05-24 21:24:08
Subsystem:
the rest · Maintainer:
Linus Torvalds
When splitting a subtree, committs that do not intersect prefix receive identity mapping (oldrev -> oldrev). If such commit is reachable by multiple paths in the revision DAG, the cache_set() function may be called twice for the same (oldrev -> newrev) pair. This triggers fatal error "cache for <hash> already exists" Bugfix is to make cache_set() idempotent when the same (oldrev -> newrev) pair appears multiple times. Signed-off-by: Roland Conybeare <redacted> --- contrib/subtree/git-subtree.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index 791fd8260c..64590e05e0 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh@@ -343,7 +343,13 @@ cache_set () { test "$oldrev" != "latest_new" && test -e "$cachedir/$oldrev" then - die "fatal: cache for $oldrev already exists!" + existing=$(cat "$cachedir/$oldrev") + if test "$existing" = "$newrev" + then + return + else + die "fatal: cache for $oldrev already exists!" + fi fi echo "$newrev" >"$cachedir/$oldrev" }
--
2.50.1