Clarify the meaning of branch.*.merge option and add a similar branch.*.localmerge option, which can be used to specify a local tracking branch to be merged by default. Previously, if branch.*.merge was specified but did not match any ref, the message "No changes." was not really helpful regarding the misconfiguration. This now gives a warning. The value of branch.*.merge can be a list to get an octopus merge. I chose the same way for branch.*.localmerge, and if you specify both options, the octopus merge will have even more parents ;-) Signed-off-by: Josef Weidendorfer <Josef.Weidendorfer@xxxxxx> --- This implements to branch.*.localmerge option as counterpart to branch.*.merge as discussed. To get the "No default merge when any branch.*.(local)merge is given, but not in current branch" feature, what is the way to check this, as git-repo-config can not match with regexps against config keys? Josef Documentation/config.txt | 23 +++++++++++++++++++++-- git-parse-remote.sh | 40 +++++++++++++++++++++++++++++++--------- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 9090762..6e19130 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -125,10 +125,29 @@ apply.whitespace:: branch.<name>.remote:: When in branch <name>, it tells `git fetch` which remote to fetch. + If this option is not given, `git fetch` defaults to "origin". branch.<name>.merge:: - When in branch <name>, it tells `git fetch` the default remote branch - to be merged. + When in branch <name>, it tells `git fetch` the default refspec to + be marked for merging in FETCH_HEAD. The value has to exactly + match a remote part of the refspecs which are fetched from the remote + repository given by "branch.<name>.remote". + The merge information is used by `git pull` (which first calls + `git fetch`) for the default merge action. + Without this or a "branch.<name>.localmerge" option, `git pull` defaults to + the first refspec fetched. + Specify multiple values to get an octopus merge. + +branch.<name>.localmerge:: + When in branch <name>, it tells `git fetch` the default refspec to + be marked for merging in FETCH_HEAD. The value has to exactly + match a local part (i.e. the local tracking branch) of the refspecs + which are fetched from the remote repository given by "branch.<name>.remote". + The merge information is used by `git pull` (which first calls + `git fetch`) for the default merge action. + Without this or a "branch.<name>.merge" option, `git pull` defaults to the + first refspec fetched. + Specify multiple values to get an octopus merge. pager.color:: A boolean to enable/disable colored output when the pager is in diff --git a/git-parse-remote.sh b/git-parse-remote.sh index da064a5..08ab272 100755 --- a/git-parse-remote.sh +++ b/git-parse-remote.sh @@ -133,7 +133,9 @@ canon_refs_list_for_fetch () { # leave the branches in branch.${curr_branch}.merge alone, # or the first one otherwise; add prefix . to the rest # to prevent the secondary branches to be merged by default. - merge_branches= + merge_remotebranches= + merge_localbranches= + found_mergerefs= if test "$1" = "-d" then shift ; remote="$1" ; shift @@ -141,8 +143,10 @@ canon_refs_list_for_fetch () { then curr_branch=$(git-symbolic-ref HEAD | \ sed -e 's|^refs/heads/||') - merge_branches=$(git-repo-config \ + merge_remotebranches=$(git-repo-config \ --get-all "branch.${curr_branch}.merge") + merge_localbranches=$(git-repo-config \ + --get-all "branch.${curr_branch}.localmerge") fi set x $(expand_refs_wildcard "$@") shift @@ -160,17 +164,31 @@ canon_refs_list_for_fetch () { remote=$(expr "z$ref" : 'z\([^:]*\):') local=$(expr "z$ref" : 'z[^:]*:\(.*\)') dot_prefix=. - if test -z "$merge_branches" + if test ! -z "$merge_remotebranches" then - merge_branches=$remote - dot_prefix= - else - for merge_branch in $merge_branches + for merge_branch in $merge_remotebranches do - [ "$remote" = "$merge_branch" ] && - dot_prefix= && break + [ "$remote" = "$merge_branch" ] && + dot_prefix= && break done fi + if test ! -z "$merge_localbranches" + then + for merge_branch in $merge_localbranches + do + [ "$local" = "$merge_branch" ] && + dot_prefix= && break + done + fi + if test -z "$merge_remotebranches" -a -z "$merge_localbranches" + then + merge_remotebranches=$remote + dot_prefix= + fi + if test -z $dot_prefix + then + found_mergeref=true + fi case "$remote" in '') remote=HEAD ;; refs/heads/* | refs/tags/* | refs/remotes/*) ;; @@ -191,6 +209,10 @@ canon_refs_list_for_fetch () { fi echo "${dot_prefix}${force}${remote}:${local}" done + if test -z $found_mergeref + then + echo >&2 "Warning: No merge candidate because of no match with branch.*.merge or branch.*.localmerge" + fi } # Returns list of src: (no store), or src:dst (store) -- 1.4.4.2.gdf61-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