[PATCH 2/2] git-submodule: add "sync" command
From: David Aguilar <hidden>
Date: 2016-06-15 22:45:12
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
When a submodule's URL changes upstream, existing submodules will be out of sync since their remote.origin.url will still be set to the old value. This change adds a "git submodule sync" command that reads the submodule URLs from .gitmodules and updates any existing submodules accordingly. Signed-off-by: David Aguilar <redacted> --- Documentation/git-submodule.txt | 7 ++++++ git-submodule.sh | 45 +++++++++++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index abbd5b7..a229032 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt@@ -15,6 +15,7 @@ SYNOPSIS 'git submodule' [--quiet] update [--init] [--] [<path>...] 'git submodule' [--quiet] summary [--summary-limit <n>] [commit] [--] [<path>...] 'git submodule' [--quiet] foreach <command> +'git submodule' [--quiet] sync [--] [<path>...] DESCRIPTION
@@ -139,6 +140,12 @@ foreach:: As an example, "git submodule foreach 'echo $path `git rev-parse HEAD`' will show the path and currently checked out commit for each submodule. +sync:: + Synchronizes each submodule's remote.origin.url configuration + setting to match that of the corresponding submodule.*.url + value as specified in .gitmodules. This is useful if your + submodule URLs have changed upstream and you want to update your + local repositories accordingly. OPTIONS -------
diff --git a/git-submodule.sh b/git-submodule.sh
index 2a3a197..46739de 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh@@ -6,7 +6,7 @@ USAGE="[--quiet] [--cached] \ [add <repo> [-b branch] <path>]|[status|init|update [-i|--init]|summary [-n|--summary-limit <n>] [<commit>]] \ -[--] [<path>...]|[foreach <command>]" +[--] [<path>...]|[foreach <command>]|[sync [<path>...]]" OPTIONS_SPEC= . git-sh-setup require_work_tree
@@ -602,6 +602,47 @@ cmd_status() fi done } +# +# Sync git urls for submodules +# This makes the value for remote.origin.url match the value +# specified in .gitmodules. +# +cmd_sync() +{ + while test $# -ne 0 + do + case "$1" in + -q|--quiet) + quiet=1 + ;; + -*) + usage + ;; + --) + shift + break + ;; + *) + break + ;; + esac + shift + done + + cd_to_toplevel + + module_list "$@" | + while read mode sha1 stage path + do + ! test -f "$path"/.git/config && + echo "Warn: submodule at path '$path' does not exist." + test -f "$path"/.git/config || continue + name=$(module_name "$path") + url=$(git config -f .gitmodules --get submodule."$name".url) + say "Synchronizing submodule url for '$name'" + git config -f "$path"/.git/config remote.origin.url "$url" + done +} # This loop parses the command line arguments to find the # subcommand name to dispatch. Parsing of the subcommand specific
@@ -612,7 +653,7 @@ cmd_status() while test $# != 0 && test -z "$command" do case "$1" in - add | foreach | init | update | status | summary) + add | foreach | init | update | status | summary | sync) command=$1 ;; -q|--quiet)
--
1.6.0.90.g436ed