diff options
-rw-r--r-- | Documentation/git-submodule.txt | 4 | ||||
-rw-r--r-- | Documentation/gitmodules.txt | 10 | ||||
-rwxr-xr-x | git-submodule.sh | 32 | ||||
-rwxr-xr-x | t/t7406-submodule-update.sh | 16 |
4 files changed, 35 insertions, 27 deletions
diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index 028640974..f993469dc 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -114,7 +114,7 @@ update:: Update the registered submodules, i.e. clone missing submodules and checkout the commit specified in the index of the containing repository. This will make the submodules HEAD be detached unless '--rebase' is - specified or the key `submodule.$name.rebase` is set to `true`. + specified or the key `submodule.$name.update` is set to `rebase`. + If the submodule is not yet initialized, and you just want to use the setting as stored in .gitmodules, you can automatically initialize the @@ -184,7 +184,7 @@ OPTIONS superproject. If this option is given, the submodule's HEAD will not be detached. If a a merge failure prevents this process, you will have to resolve these failures with linkgit:git-rebase[1]. - If the key `submodule.$name.rebase` is set to `true`, this option is + If the key `submodule.$name.update` is set to `rebase`, this option is implicit. <path>...:: diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt index 7c22c4094..1b67f0a9f 100644 --- a/Documentation/gitmodules.txt +++ b/Documentation/gitmodules.txt @@ -30,8 +30,14 @@ submodule.<name>.path:: submodule.<name>.url:: Defines an url from where the submodule repository can be cloned. -submodule.<name>.rebase:: - Defines that the submodule should be rebased by default. +submodule.<name>.update:: + Defines what to do when the submodule is updated by the superproject. + If 'checkout' (the default), the new commit specified in the + superproject will be checked out in the submodule on a detached HEAD. + If 'rebase', the current branch of the submodule will be rebased onto + the commit specified in the superproject. + This config option is overridden if 'git submodule update' is given + the '--rebase' option. EXAMPLES diff --git a/git-submodule.sh b/git-submodule.sh index 3176226ac..f384c6b2b 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -17,7 +17,7 @@ branch= quiet= cached= nofetch= -rebase= +update= # # print stuff on stdout unless -q was specified @@ -295,10 +295,10 @@ cmd_init() git config submodule."$name".url "$url" || die "Failed to register url for submodule path '$path'" - test true != "$(git config -f .gitmodules --bool \ - submodule."$name".rebase)" || - git config submodule."$name".rebase true || - die "Failed to register submodule path '$path' as rebasing" + upd="$(git config -f .gitmodules submodule."$name".update)" + test -z "$upd" || + git config submodule."$name".update "$upd" || + die "Failed to register update mode for submodule path '$path'" say "Submodule '$name' ($url) registered for path '$path'" done @@ -329,7 +329,7 @@ cmd_update() ;; -r|--rebase) shift - rebase=true + update="rebase" ;; --) shift @@ -349,7 +349,7 @@ cmd_update() do name=$(module_name "$path") || exit url=$(git config submodule."$name".url) - rebase_module=$(git config --bool submodule."$name".rebase) + update_module=$(git config submodule."$name".update) if test -z "$url" then # Only mention uninitialized submodules when its @@ -370,9 +370,9 @@ cmd_update() die "Unable to find current revision in submodule path '$path'" fi - if test true = "$rebase" + if ! test -z "$update" then - rebase_module=true + update_module=$update fi if test "$subsha1" != "$sha1" @@ -390,16 +390,18 @@ cmd_update() die "Unable to fetch in submodule path '$path'" fi - if test true = "$rebase_module" - then - command="git-rebase" + case "$update_module" in + rebase) + command="git rebase" action="rebase" msg="rebased onto" - else - command="git-checkout $force -q" + ;; + *) + command="git checkout $force -q" action="checkout" msg="checked out" - fi + ;; + esac (unset GIT_DIR; cd "$path" && $command "$sha1") || die "Unable to $action '$sha1' in submodule path '$path'" diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh index 3442c05d2..0773fe405 100755 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@ -76,9 +76,9 @@ test_expect_success 'submodule update --rebase staying on master' ' ) ' -test_expect_success 'submodule update - rebase true in .git/config' ' +test_expect_success 'submodule update - rebase in .git/config' ' (cd super && - git config submodule.submodule.rebase true + git config submodule.submodule.update rebase ) && (cd super/submodule && git reset --hard HEAD~1 @@ -93,9 +93,9 @@ test_expect_success 'submodule update - rebase true in .git/config' ' ) ' -test_expect_success 'submodule update - rebase false in .git/config but --rebase given' ' +test_expect_success 'submodule update - checkout in .git/config but --rebase given' ' (cd super && - git config submodule.submodule.rebase false + git config submodule.submodule.update checkout ) && (cd super/submodule && git reset --hard HEAD~1 @@ -110,9 +110,9 @@ test_expect_success 'submodule update - rebase false in .git/config but --rebase ) ' -test_expect_success 'submodule update - rebase false in .git/config' ' +test_expect_success 'submodule update - checkout in .git/config' ' (cd super && - git config submodule.submodule.rebase false + git config submodule.submodule.update checkout ) && (cd super/submodule && git reset --hard HEAD^ @@ -131,9 +131,9 @@ test_expect_success 'submodule init picks up rebase' ' (cd super && git config submodule.rebasing.url git://non-existing/git && git config submodule.rebasing.path does-not-matter && - git config submodule.rebasing.rebase true && + git config submodule.rebasing.update rebase && git submodule init rebasing && - test true = $(git config --bool submodule.rebasing.rebase) + test "rebase" = $(git config submodule.rebasing.update) ) ' |