How is working on arbitrary remote heads supposed to work in Cogito (+ PATCH)?
- From
- Josef Weidendorfer <josef.weidendorfer@gmx.de>
- Date
- Jul 27, 2005, 12:58 UTC
- Message-ID
- <200507271458.43063.Josef.Weidendorfer@gmx.de>
Hi,
if I clone a remote head other than master via Cogito with
cg-clone host:path#remoteHead,
work on this branch, and try to push back my changes with
cg-push,
I get the error
"pushing to a different head not supported yet".
As far as I can see, there is no support in core GIT to make this ever work (at least with get-send-packs), as "git-send-pack" only updates a set of heads with the same name both locally and remote.
I suppose the best would be to always keep the same head names in cloned repositories - it seems to be easier to handle for users. Perhaps the only exception would be "master", as one probably would like to pull masters of different remote repositories into a local one (without really working on them).
Thus, what about the following: Each time a remote head other than master is cloned, a head with the same name is created locally which is an alias to the local master. This way, cg-push almost works out of the box. Following patch implements this behavior.
Josef
diff --git a/cg-clone b/cg-clone --- a/cg-clone +++ b/cg-clone @@ -69,5 +69,12 @@ cp $_git/refs/heads/origin $_git/refs/he git-read-tree HEAD git-checkout-cache -a git-update-cache --refresh echo "Cloned to $dir/ (origin $location available as branch \"origin\")" + +if echo "$location" | grep -q "#" ; then + rembranch=$(echo "$location" | sed -e "s/.*#//") + (cd $_git/refs/heads; ln -s master "$rembranch") + echo "Remote head \"$rbranch\" locally available as alias for \"master\"" +fi + diff --git a/cg-push b/cg-push --- a/cg-push +++ b/cg-push @@ -28,17 +28,18 @@ uri=$(cat "$_git/branches/$name" 2>/dev/ rembranch=master if echo "$uri" | grep -q '#'; then rembranch=$(echo $uri | cut -d '#' -f 2) uri=$(echo $uri | cut -d '#' -f 1) - die "pushing to a different head not supported yet" + [ -s $_git/refs/heads/$rembranch ] || (cd $_git/refs/heads;ln -s master $rembranch) + [ $(readlink $_git/refs/heads/$rembranch) = "master" ] || \ + die "can not push to remote head \"$rembranch\"" fi if echo "$uri" | grep -q "^http://"; then die "pushing over HTTP not supported yet" elif echo "$uri" | grep -q "^git+ssh://"; then git-send-pack "$(echo "$uri" | sed 's#^git+ssh://\([^/]*\)\(/.*\)$#\1:\2#')" $rembranch -elif echo "$uri" | grep -q ":"; then +elif echo "$uri" | grep -q "^rsync://"; then die "pushing over rsync not supported" else git-send-pack "$uri" $rembranch fi