threads / discuss / 1456

A simple script to do the reverse of git-push

Subject: A simple script to do the reverse of git-push

## tl;dr

4 messages between Aug 8, 2005 and Aug 11, 2005.

replies: 3people: 3as markdown or json

Johannes Schindelin· Aug 8, 2005, 21:25 UTC · lore
Hi list,

I mentioned in another mail that I needed the opposite of git-push, namely getting all heads, and if they are strict parents of the local refs, just update them.

Well, Junio pointed out that it's easy using the available tools, and he was right. The result is attached (and tested...).

This script makes it easy to work with a central repository, multiple heads and users, in a CVS style: to start your day, you call the attached script, and after you have committed something, you can do a push on the repository. Sometimes, the push fails, then you have to pull that branch in order to merge it before trying a push again.

BTW, if you are lazy, like me, you just pull from Junio once in a while and do a "make test". Turns out there is a missing dependency though:

peek-remote.o: cache.h

which in my case lead to a git-peek-remote program which was unable to peek any ref.

Ciao, Dscho

#!/bin/sh
. git-sh-setup-script || die "Not a git archive"

. git-parse-remote "$@" repo="$_remote_repo"

git-ls-remote-script --heads "$repo" | while read sha1 refname; do
	shortname=$(basename $refname)
	if [ -e $GIT_DIR/$refname ]; then
		if [ $sha1 = $(cat $GIT_DIR/$refname) ]; then
			echo $shortname up to date. 1>&2
			continue
		fi
	fi
	git-cat-file commit $sha1 >/dev/null 2>&1 ||
	git-fetch-script $repo $shortname
	if [ ! -e $GIT_DIR/$refname ]; then
		echo Got new head $shortname 1>&2
		echo $sha1 > $GIT_DIR/$refname
	else
		origsha1=$(cat $GIT_DIR/$refname)
		if [ -z "$(git-rev-list $origsha1 ^$sha1)" ]; then
			echo Updated head $shortname 1>&2
			echo $sha1 > $GIT_DIR/$refname
		else
			saveref=$GIT_DIR/FETCH_HEAD_$shortname
			echo Error: $shortname not a child of remote head 1>&2
			echo "	Saved remote head to $saveref" 1>&2
			echo $sha1 > $saveref
		fi
	fi
done
Junio C Hamano· Aug 8, 2005, 22:42 UTC · re: Johannes Schindelin · lore

Re: A simple script to do the reverse of git-push

Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
Show 7 quoted lines
> BTW, if you are lazy, like me, you just pull from Junio once in a while 
> and do a "make test". Turns out there is a missing dependency though:
>
> peek-remote.o: cache.h
>
> which in my case lead to a git-peek-remote program which was unable to 
> peek any ref.
You are right.  Thanks for noticing.
    $ (make clean ; make ) >/dev/null 2>/dev/null
    $ touch cache.h
    $ make 2>&1 | grep peek-remote
    cc -g -O2 -Wall  '-DSHA1_HEADER=<openssl/sha.h>' -o git-peek-remote peek-remote.o libgit.a -lz -lcrypto

I think recent "depend on object files" Makefile patch broke some things.

We would need something like this. --- # - pu: ls-remote: drop storing operation and add documentation. # + (working tree)

diff --git a/Makefile b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -172,6 +172,7 @@ init-db.o: init-db.c
 	$(CC) -c $(CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir)"' $*.c
 
 $(LIB_OBJS): $(LIB_H)
+$(patsubst git-%,%.o,$(PROG)): $(LIB_H)
 $(DIFF_OBJS): diffcore.h
 
 $(LIB_FILE): $(LIB_OBJS)
Johannes Schindelin· Aug 8, 2005, 23:38 UTC · re: Junio C Hamano · lore

Re: A simple script to do the reverse of git-push

Hi,
On Mon, 8 Aug 2005, Junio C Hamano wrote:
Show 5 quoted lines
> We would need something like this.
>
> [...]
>
> +$(patsubst git-%,%.o,$(PROG)): $(LIB_H)
A short
	for i in git-*; do \
		c=$(echo $i|sed "s/git-\(.*\)/\1.c/g")
		if [ -e $c ]; then \
			if ! grep cache\\.h $c; then \
				echo $c does not depend on cache.h \
			fi \
		fi \
	done

(actually tested) reveals that only get-tar-commit-id.c and stripspace.c do not depend on cache.h or rev-cache.h. Thus, your patch is the most elegant solution to my problem :-)

Ciao, Dscho

Petr Baudis· Aug 11, 2005, 22:18 UTC · re: Junio C Hamano · lore

Re: A simple script to do the reverse of git-push

Dear diary, on Tue, Aug 09, 2005 at 12:42:36AM CEST, I got a letter where Junio C Hamano <junkio@cox.net> told me that...

Show 19 quoted lines
> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> 
> > BTW, if you are lazy, like me, you just pull from Junio once in a while 
> > and do a "make test". Turns out there is a missing dependency though:
> >
> > peek-remote.o: cache.h
> >
> > which in my case lead to a git-peek-remote program which was unable to 
> > peek any ref.
> 
> You are right.  Thanks for noticing.
> 
>     $ (make clean ; make ) >/dev/null 2>/dev/null
>     $ touch cache.h
>     $ make 2>&1 | grep peek-remote
>     cc -g -O2 -Wall  '-DSHA1_HEADER=<openssl/sha.h>' -o git-peek-remote peek-remote.o libgit.a -lz -lcrypto
> 
> I think recent "depend on object files" Makefile patch broke
> some things.

Indeed. I took care to make the new dependencies a superset of previous situation when removing the explicit dependencies list, but before, rebuilding of libgit.a caused rebuilt from source of all the commands, which wouldn't happen anymore after adding the object files, which this way sneakily removed an implicit dependency of the command sources on $(LIB_H). Eek.

-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
If you want the holes in your knowledge showing up try teaching
someone.  -- Alan Cox

← back to recent threads