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

[PATCH v2 4/4] subtree: improve decision on merges kept in split

From
Roger Strain <rstrain@swri.org>
Date
Oct 11, 2018, 19:46 UTC
Message-ID
<20181011194605.19518-5-rstrain@swri.org>
In-Reply-To
<20180928183540.48968-1-roger.strain@swri.org>
From: "Strain, Roger L" <roger.strain@swri.org>

When multiple identical parents are detected for a commit being considered for copying, explicitly check whether one is the common merge base between the commits. If so, the other commit can be used as the identical parent; if not, a merge must be performed to maintain history.

In some situations two parents of a merge commit may appear to both have identical subtree content with each other and the current commit. However, those parents can potentially come from different commit graphs.

Previous behavior would simply select one of the identical parents to serve as the replacement for this commit, based on the order in which they were processed.

New behavior compares the merge base between the commits to determine if a new merge commit is necessary to maintain history despite the identical content.

Signed-off-by: Strain, Roger L <roger.strain@swri.org>
---
 contrib/subtree/git-subtree.sh | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/contrib/subtree/git-subtree.sh b/contrib/subtree/git-subtree.sh
index eef4199ae..7dd643998 100755
--- a/contrib/subtree/git-subtree.sh
+++ b/contrib/subtree/git-subtree.sh
@@ -541,6 +541,7 @@ copy_or_skip () {
 	nonidentical=
 	p=
 	gotparents=
+	copycommit=
 	for parent in $newparents
 	do
 		ptree=$(toptree_for_commit $parent) || exit $?
@@ -548,7 +549,24 @@ copy_or_skip () {
 		if test "$ptree" = "$tree"
 		then
 			# an identical parent could be used in place of this rev.
-			identical="$parent"
+			if test -n "$identical"
+			then
+				# if a previous identical parent was found, check whether
+				# one is already an ancestor of the other
+				mergebase=$(git merge-base $identical $parent)
+				if test "$identical" = "$mergebase"
+				then
+					# current identical commit is an ancestor of parent
+					identical="$parent"
+				elif test "$parent" != "$mergebase"
+				then
+					# no common history; commit must be copied
+					copycommit=1
+				fi
+			else
+				# first identical parent detected
+				identical="$parent"
+			fi
 		else
 			nonidentical="$parent"
 		fi
@@ -571,7 +589,6 @@ copy_or_skip () {
 		fi
 	done
 
-	copycommit=
 	if test -n "$identical" && test -n "$nonidentical"
 	then
 		extras=$(git rev-list --count $identical..$nonidentical)
-- 
2.19.1
Previous: Strain, Roger LNext: Roger Strain
Message 6 of 11 in “Multiple subtree split fixes regarding complex repos”
  1. 0/4 Multiple subtree split fixes regarding complex reposStrain, Roger L, Sep 28, 2018
  2. 3/4 subtree: use commits before rejoins for splitsStrain, Roger L, Sep 28, 2018
  3. 2/4 subtree: make --ignore-joins pay attention to addsStrain, Roger L, Sep 28, 2018
  4. 1/4 subtree: refactor split of a commit into standalone methodStrain, Roger L, Sep 28, 2018
  5. 4/4 subtree: improve decision on merges kept in splitStrain, Roger L, Sep 28, 2018
  6. 4/4 subtree: improve decision on merges kept in splitRoger Strain, Oct 11, 2018
  7. 0/4 Multiple subtree split fixes regarding complex reposRoger Strain, Oct 11, 2018
  8. Junio C HamanoOct 12, 2018
  9. 3/4 subtree: use commits before rejoins for splitsRoger Strain, Oct 11, 2018
  10. 2/4 subtree: make --ignore-joins pay attention to addsRoger Strain, Oct 11, 2018
  11. 1/4 subtree: refactor split of a commit into standalone methodRoger Strain, Oct 11, 2018

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.