threads / patch / 199

patchAdd "git push"

Subject: [PATCH] Add "git push"

## tl;dr

2 messages between Apr 21, 2005 and Apr 21, 2005. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Matthias Urlichs· Apr 21, 2005, 12:43 UTC · lore

This patch adds the ability to "git push", as the obvious converse of "git pull".

Signed-Off-By: Matthias Urlichs <smurf@smurf.noris.de>
Show changes to diff +61 −0
Index: git
===================================================================
--- 42a073eb6b5bb397a3e8768a032463a7fa02e6b9/git  (mode:100755 sha1:557122dfb05580e4af2c55767f3d6f92b9110edd)
+++ 265515f9c4f089b1b61e9d2312c4b3babe189618/git  (mode:100644 sha1:c32ee037c4dd68f8fa6723cb115644d46810bc89)
@@ -42,6 +42,7 @@
 	merge		[-c] [-b BASE_ID] FROM_ID
 	patch		[COMMIT_ID]
 	pull		[RNAME]
+	push		[RNAME]
 	rm		FILE...
 	seek		[COMMIT_ID]
 	status
@@ -86,6 +87,7 @@
 "lsremote")   gitlsremote.sh "$@";;
 "merge")      gitmerge.sh "$@";;
 "pull")       gitpull.sh "$@";;
+"push")       gitpush.sh "$@";;
 "patch")      gitpatch.sh "$@";;
 "rm")         gitrm.sh "$@";;
 "seek")       gitseek.sh "$@";;
--- /dev/null  (tree:42a073eb6b5bb397a3e8768a032463a7fa02e6b9)
+++ 265515f9c4f089b1b61e9d2312c4b3babe189618/gitpush.sh  (mode:100644 sha1:0a658141991c602ca327edb9ab982d7660d7c665)
@@ -0,0 +1,59 @@
+#!/bin/sh
+#
+# Pushes changes from the local GIT repository to "remote".
+# Copyright (c) Matthias Urlichs, 2005
+#
+# Takes the remote's name.
+
+name=$1
+
+die () {
+	echo gitpush.sh: $@ >&2
+	exit 1
+}
+
+
+[ "$name" ] || name=$(cat .git/tracking 2>/dev/null)
+[ "$name" ] || die "where to push to?"
+uri=$(grep $(echo -e "^$name\t" | sed 's/\./\\./g') .git/remotes | cut -f 2)
+[ "$uri" ] || die "unknown remote"
+
+
+tracking=
+[ -s .git/tracking ] && tracking=$(cat .git/tracking)
+
+orig_head=
+if [ "$tracking" = "$name" ]; then
+	[ -s .git/HEAD.tracked ] && orig_head=$(cat .git/HEAD.tracked)
+else
+	[ -s ".git/heads/$name" ] && orig_head=$(cat ".git/heads/$name")
+fi
+
+rsync $RSYNC_FLAGS -Lr "$uri/HEAD" ".git/HEAD_$name"
+$id=$(cat ".git/HEAD_$name")
+rm .git/HEAD_$name
+
+if [ -z "$id" ] ; then
+	echo "The remote system doesn't have a HEAD file: Doing an initial upload." >&2
+	echo "." >&2
+elif [ "$(cat-file -t "$id")" != "commit" ]; then
+	echo "The remote system has stuff we don't have: pull first!" >&2
+	echo "	Commit ID: $id" >&2
+	exit 1
+fi
+
+# We already saw the MOTD, thank you very much.
+rsync $RSYNC_FLAGS --ignore-existing --whole-file \
+	-v -r ".git/objects" "$uri" | grep -v '^MOTD:'
+
+# FIXME: Warn about conflicting tag names?
+rsync $RSYNC_FLAGS --ignore-existing \
+	-v -r ".git/tags" "$uri" 2>/dev/null | grep -v '^MOTD:'
+
+# Finally, update the remote HEAD
+rsync $RSYNC_FLAGS -Lr ".git/HEAD" "$uri/HEAD" \
+	2>/dev/null | grep -v '^MOTD:'
+
+echo "Now up to date."
+exit
+
Petr Baudis· Apr 21, 2005, 20:41 UTC · re: Matthias Urlichs · lore

Re: [PATCH] Add "git push"

Dear diary, on Thu, Apr 21, 2005 at 02:43:33PM CEST, I got a letter where Matthias Urlichs <smurf@smurf.noris.de> told me that...

> This patch adds the ability to "git push", as the obvious converse of
> "git pull".

While lack of locking is a problem for git-pasky too, for this git push it is a downright disaster waiting to happen. It might be also a good idea to check for remote 'blocked' file, which must exist and contain only a "pushtree" line. This is so that no (sensible) real working tree is attached to it, which would be a disaster for it too.

You probably don't want to allow pushing if your local tree is blocked. And you want to allow pushing only when HEAD is your ancestor. (Helper tool wanted for this - we need this in git merge badly too.)

BTW, it contains some unrelated and seemingly irrelevant tracking stuff.
-- 
				Petr "Pasky" Baudis
Stuff: http://pasky.or.cz/
C++: an octopus made by nailing extra legs onto a dog. -- Steve Taylor

← back to recent threads