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

[PATCHv2 2/2] submodule update: allow '.' for branch value

From
Stefan Beller <sbeller@google.com>
Date
Jul 28, 2016, 18:21 UTC
Message-ID
<20160728182132.25088-1-sbeller@google.com>
In-Reply-To
<20160728172641.8376-3-sbeller@google.com>

Gerrit has a "superproject subscription" feature[1], that triggers a commit in a superproject that is subscribed to its submodules. Conceptually this Gerrit feature can be done on the client side with Git via:

    git -C <superproject> submodule update --remote --force
    git -C <superproject> commit -a -m "Update submodules"
    git -C <superproject> push

for each branch in the superproject. To ease the configuration in Gerrit a special value of "." has been introduced for the submodule.<name>.branch to mean the same branch as the superproject[2], such that you can create a new branch on both superproject and the submodule and this feature continues to work on that new branch.

Now we have find projects in the wild with such a .gitmodules file. To have Git working well with these, we imitate the behavior and look up the superprojects branch name if the submodules branch is configured to ".". In projects that do not use Gerrit, this value whould be never configured as "." is not a valid branch name.

[1] introduced around 2012-01, e.g.
    https://gerrit-review.googlesource.com/#/c/30810/
[2] excerpt from [1]:
 > The branch value could be '.' if the submodule project branch
 > has the same name as the destination branch of the commit having
 > gitlinks/.gitmodules file.
CC: Avery Pennarun <apenwarr@gmail.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
---
 This comes with another test that I run into while using this code.
 Please replace patch 2 with this v2.
 
 Thanks,
 Stefan
 git-submodule.sh            |  9 ++++++++-
 t/t7406-submodule-update.sh | 42 +++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index 4ec7546..1eb33ad 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -590,7 +590,6 @@ cmd_update()
 
 		name=$(git submodule--helper name "$sm_path") || exit
 		url=$(git config submodule."$name".url)
-		branch=$(get_submodule_config "$name" branch master)
 		if ! test -z "$update"
 		then
 			update_module=$update
@@ -616,6 +615,14 @@ cmd_update()
 
 		if test -n "$remote"
 		then
+			branch=$(get_submodule_config "$name" branch master)
+			if test "$branch" = "."
+			then
+				if ! branch=$(git symbolic-ref --short -q HEAD)
+				then
+					die "$(eval_gettext "submodule branch configured to inherit branch from superproject, but it's not on any branch")"
+				fi
+			fi
 			if test -z "$nofetch"
 			then
 				# Fetch remote before determining tracking $sha1
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index bd261ac..953c486 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -209,9 +209,49 @@ test_expect_success 'submodule update --remote should fetch upstream changes' '
 	)
 '
 
-test_expect_success 'local config should override .gitmodules branch' '
+test_expect_success 'submodule update --remote should fetch upstream changes with .' '
+	(cd super &&
+	 git config -f .gitmodules submodule."submodule".branch "." &&
+	 git add .gitmodules &&
+	 git commit -m "submodules: update from the respective superproject branch"
+	) &&
 	(cd submodule &&
+	 echo line4a >> file &&
+	 git add file &&
+	 test_tick &&
+	 git commit -m "upstream line4a" &&
+	 git checkout -b test-branch &&
+	 test_commit on-test-branch
+	) &&
+	(cd super &&
+	 git submodule update --remote --force submodule &&
+	 (cd submodule &&
+	  test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git log -1 --oneline master)"
+	 ) &&
 	 git checkout -b test-branch &&
+	 git submodule update --remote --force submodule &&
+	 (cd submodule &&
+	  test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git log -1 --oneline test-branch)"
+	 ) &&
+	 git checkout master &&
+	 git branch -d test-branch
+	)
+'
+
+test_expect_success 'branch = . does not confuse the rest of update' '
+	(cd super &&
+	 git checkout --detach &&
+	 # update is not confused by branch="." even if the the superproject
+	 # is not on any branch currently
+	 git submodule update &&
+	 git revert HEAD &&
+	 git checkout master
+	)
+'
+
+test_expect_success 'local config should override .gitmodules branch' '
+	(cd submodule &&
+	 git checkout test-branch &&
 	 echo line5 >> file &&
 	 git add file &&
 	 test_tick &&
-- 
2.9.2.468.g3d9025b
Previous: Stefan BellerNext: Junio C Hamano
Message 8 of 11 in “submodule update: allow '.' for branch value”
  1. 0/2 submodule update: allow '.' for branch valueStefan Beller, Jul 28, 2016
  2. 1/2 t7406: correct depth test in shallow testStefan Beller, Jul 28, 2016
  3. Junio C HamanoJul 28, 2016
  4. Stefan BellerJul 28, 2016
  5. Stefan BellerJul 28, 2016
  6. Junio C HamanoJul 28, 2016
  7. 2/2 submodule update: allow '.' for branch valueStefan Beller, Jul 28, 2016
  8. 2/2 submodule update: allow '.' for branch valueStefan Beller, Jul 28, 2016
  9. Junio C HamanoJul 28, 2016
  10. Stefan BellerJul 28, 2016
  11. Junio C HamanoJul 28, 2016

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.