Skip to contentSkip to conversation

Per branch properties for pull

RFC/PATCH Santi Béjar 2 participants 3 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

It extracts all the information for pull from the config file.

If you have a config file as:

[branch "master"]
remote=origin
merge=next #the remote name
octopus=octopus
twohead=recursive

When doing a "git pull" without extra parameters in the master branch it will fetch the origin remote repository and will merge the next branch (the remote name).

And you can also put the equivalent of the pull.{octopus,twohead} options for each branch.

This only changes the behavour when these keys exist and when git-pull is used without extra parameters.

---

Hi *,

Now that we have the arbitrary keys in the config file...

It does not affect the integrator that pulls from different places. I don't know exactly what is needed but just for discuss it could be something as:

[branch "master"]
remote=net
remote=ata
merge=for-linus from ata
merge=upstream from net

git-pull.sh +28 -0
index f380437..e7630b1 100755
@@ -44,6 +44,14 @@ do
 	shift
 done
 
+if [ $# -eq 0 ] ; then
+    default=yes
+    curr_branch=$(git-symbolic-ref HEAD)
+    curr_branch=${curr_branch##refs/heads/}
+    remote=$(git-repo-config --get "branch.$curr_branch.remote")
+    test "$remote" && set x "$remote" && shift
+fi
+
 orig_head=$(git-rev-parse --verify HEAD) || die "Pulling into a black hole?"
 git-fetch --update-head-ok --reflog-action=pull "$@" || exit 1
 
@@ -70,9 +78,19 @@ to recover.'
 
 fi
 
+if [ "$default" == yes ] ; then
+    merge_head=$(git repo-config --get-all "branch.$curr_branch.merge")
+    for ref in $merge_head ; do
+	refspec=$(git-repo-config --get "remote.$remote.fetch" "^$ref:")
+	[ -z "$refspec" ] && die "Branch $ref does not exist in the repository: $remote."
+	locref="$locref ${refspec##$ref:}"
+    done
+    merge_head=$locref
+else
 merge_head=$(sed -e '/	not-for-merge	/d' \
 	-e 's/	.*//' "$GIT_DIR"/FETCH_HEAD | \
 	tr '\012' ' ')
+fi
 
 case "$merge_head" in
 '')
@@ -85,6 +103,11 @@ case "$merge_head" in
 	then
 		strategy_default_args="-s $var"
 	fi
+	var=`git-repo-config --get branch.$curr_branch.octopus`
+	if test -n "$var"
+	then
+		strategy_default_args="-s $var"
+	fi
 	;;
 *)
 	var=`git-repo-config --get pull.twohead`
@@ -92,6 +115,11 @@ case "$merge_head" in
         then
 		strategy_default_args="-s $var"
 	fi
+	var=`git-repo-config --get branch.$curr_branch.twohead`
+	if test -n "$var"
+        then
+		strategy_default_args="-s $var"
+	fi
 	;;
 esac
 
#1 lore raw
Quoted 14 lines · Santi Béjar

It extracts all the information for pull from the config file.

If you have a config file as:

[branch "master"]
remote=origin
merge=next #the remote name
octopus=octopus
twohead=recursive

When doing a "git pull" without extra parameters in the master branch it will fetch the origin remote repository and will merge the next branch (the remote name).

Quoted 7 lines

And you can also put the equivalent of the pull.{octopus,twohead} options for each branch.

This only changes the behavour when these keys exist and when git-pull is used without extra parameters.

I am in general in agreement with this line of thought and had an impression that many on the list wanted to have per-branch configuration. I am a bit too tired now so I'd just let you know I am interested but would not apply it tonight.

Opinions? Comments? Anything missing or objectionable on Santi's patch from the list?

author
#2 lore raw

2006/7/24, Junio C Hamano <[email protected]>:

Quoted 12 lines
Quoted 10 lines · Santi Béjar

It extracts all the information for pull from the config file.

If you have a config file as:

[branch "master"]
remote=origin
merge=next #the remote name
octopus=octopus
twohead=recursive

[...]

Quoted 7 lines

I am in general in agreement with this line of thought and had an impression that many on the list wanted to have per-branch configuration. I am a bit too tired now so I'd just let you know I am interested but would not apply it tonight.

Opinions? Comments? Anything missing or objectionable on Santi's patch from the list?

Actually my patch is a RFC to agree on the config semantics, (although I do not mind if committed to "pu" :) :

.- are remote/merge good names?
.- the merge key is the name of the remote branch.
.- are the octopus and twohead OK?
.- for a local merge, is remote=. OK?
.- "git pull ." to mean: do not fetch anything but merge the default branch? .- for the integrator case:
* is the "merge= rembranch from remote" OK?
* "git pull remotename" should read the branch properties if
branch.$curr_branch.remote=remotename?
* It could be usefull to have a git-merge-seq that performs a
twohead merge sequentially instead of an octopus.

The patch as is works for me and it currently depends on the remote config being in .git/config.

It only touchs git-pull, just to have a working prototype of the semantics and to minimize the breakage, but it could be that it should be integrated in the git-parse-remote.

Santi