From: "W. Trevor King" <wking@xxxxxxxxxx> Don't force the user to clone from the tracked repository (branch.<name>.remote) or `origin`. By setting submodule.<name>.remote in .gitmodules or the usual git config files, you can easily point a submodule at a different remote when using `submodule update --remote`. The configured remote name is also used in `submodule sync` to determine which remote.<name>.url is updated with the submodule's origin URL. Signed-off-by: W. Trevor King <wking@xxxxxxxxxx> --- Documentation/config.txt | 7 ++++--- Documentation/git-submodule.txt | 10 +++++----- git-submodule.sh | 27 +++++++++++++++++++++------ t/t7406-submodule-update.sh | 18 ++++++++++++++++++ 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 6f4663c..c54b9b4 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -1999,10 +1999,11 @@ submodule.<name>.update:: by 'git submodule init'; edit them to override the URL and other values found in the `.gitmodules` file. See +submodule.<name>.remote:: submodule.<name>.branch:: - The remote branch name for a submodule, used by `git submodule - update --remote`. Set this option to override the value found in - the `.gitmodules` file. See linkgit:git-submodule[1] and + The remote repository and branch names for a submodule, used by `git + submodule update --remote`. Set these options to override the value + found in the `.gitmodules` file. See linkgit:git-submodule[1] and linkgit:gitmodules[5] for details. submodule.<name>.fetchRecurseSubmodules:: diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index 988bba9..1d8d5f1 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -242,11 +242,11 @@ OPTIONS This option is only valid for the update command. Instead of using the superproject's recorded SHA-1 to update the submodule, use the status of the submodule's remote tracking branch. The remote used - is branch's remote (`branch.<name>.remote`), defaulting to `origin`. - The remote branch used defaults to `master`, but the branch name may - be overridden by setting the `submodule.<name>.branch` option in - either `.gitmodules` or `.git/config` (with `.git/config` taking - precedence). + is branch's remote (`branch.<name>.remote`, defaulting to `origin`), + and the remote branch used defaults to `master`, but either may be + overridden by setting the `submodule.<name>.remote` or + `submodule.<name>.branch` option in `.gitmodules` or `.git/config` + (with `.git/config` taking precedence). + This works for any of the supported update procedures (`--checkout`, `--rebase`, etc.). The only change is the source of the target SHA-1. diff --git a/git-submodule.sh b/git-submodule.sh index 27b02fe..3e39e29 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -179,6 +179,21 @@ get_submodule_config() printf '%s' "${value:-$default}" } +# +# Print the name of a submodule's configured remote +# +# $1 = submodule name +# +get_submodule_remote() +{ + name="$1" + remote=$(get_submodule_config "$name" remote) + if test -z "$remote" + then + remote=$(get_default_remote) + fi + printf '%s' "${remote}" +} # # Map submodule path to submodule name @@ -605,6 +620,7 @@ cmd_update() fi name=$(module_name "$sm_path") || exit url=$(git config submodule."$name".url) + remote_name=$(get_submodule_remote "$name") branch=$(get_submodule_config "$name" branch master) if ! test -z "$update" then @@ -645,10 +661,9 @@ Maybe you want to use 'update --init'?")" if test -z "$nofetch" then # Fetch remote before determining tracking $sha1 - (clear_local_git_env; cd "$sm_path" && git-fetch) || - die "$(eval_gettext "Unable to fetch in submodule path '\$sm_path'")" + (clear_local_git_env; cd "$sm_path" && git-fetch "$remote_name") || + die "$(eval_gettext "Unable to fetch '\$remote_name' in submodule path '\$sm_path'")" fi - remote_name=$(get_default_remote) sha1=$(clear_local_git_env; cd "$sm_path" && git rev-parse --verify "${remote_name}/${branch}") || die "$(eval_gettext "Unable to find current ${remote_name}/${branch} revision in submodule path '\$sm_path'")" @@ -669,8 +684,8 @@ Maybe you want to use 'update --init'?")" # is not reachable from a ref. (clear_local_git_env; cd "$sm_path" && ( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) && - test -z "$rev") || git-fetch)) || - die "$(eval_gettext "Unable to fetch in submodule path '\$sm_path'")" + test -z "$rev") || git-fetch "$remote_name")) || + die "$(eval_gettext "Unable to fetch '\$remote_name' in submodule path '\$sm_path'")" fi # Is this something we just cloned? @@ -1110,7 +1125,7 @@ cmd_sync() ( clear_local_git_env cd "$sm_path" - remote=$(get_default_remote) + remote=$(get_submodule_remote "$name") git config remote."$remote".url "$sub_origin_url" ) fi diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index a567834..86c85f8 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -149,6 +149,24 @@ test_expect_success 'submodule update --remote should fetch upstream changes' ' ) ' +test_expect_success 'local config should override .gitmodules remote' ' + (cd submodule && + echo line5-master >> file && + git add file && + test_tick && + git commit -m "upstream line5-master" + ) && + (cd super/submodule && + git remote rename origin test-remote + ) && + (cd super && + git config submodule.submodule.remote test-remote && + git submodule update --remote --force submodule && + cd submodule && + test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git log -1 --oneline)" + ) +' + test_expect_success 'local config should override .gitmodules branch' ' (cd submodule && git checkout -b test-branch && -- 1.8.0.4.gf74b0fc.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html