Since pull and fetch are done often against the same remote
repository, keeping the URL to pull from along with the name of
the head in $GIT_DIR/branches/$name like Cogito does makes a lot
of sense.  Adopt that and be compatible with Cogito for usability.

Signed-off-by: Junio C Hamano <[EMAIL PROTECTED]>
---

*** Although I have tested it to see the change does what it
*** advertises to do, I would like to hear comments from the
*** list if things like this would be good to have in the
*** barebone Porcelain.  I personally think this is a good
*** usability enhancement without complicating it too much.

 Documentation/git-fetch-script.txt |   40 +++++++++++++++++++++++++++
 Documentation/git-pull-script.txt  |   20 +++++++++++--
 Documentation/git.txt              |    9 +++++-
 Documentation/tutorial.txt         |   13 +++++++++
 git-fetch-script                   |   44 +++++++++++++++++++++++------
 git-pull-script                    |   54 +++++++++++++++++++++++++++---------
 6 files changed, 152 insertions(+), 28 deletions(-)
 create mode 100644 Documentation/git-fetch-script.txt

804f1002c007106fb1aeade4b4549169e92042a2
diff --git a/Documentation/git-fetch-script.txt 
b/Documentation/git-fetch-script.txt
new file mode 100644
--- /dev/null
+++ b/Documentation/git-fetch-script.txt
@@ -0,0 +1,40 @@
+git-fetch-script(1)
+===================
+v0.1, July 2005
+
+NAME
+----
+git-fetch-script - Download objects and a head from another repository.
+
+
+SYNOPSIS
+--------
+'git-fetch-script' <repository> [ <head> | tag <tag> ]
+
+'git-fetch-script' -b <name>
+
+
+DESCRIPTION
+-----------
+Fetches a named head or a tag from another repository, along
+with the objects necessary to complete that head or tag.  The
+head to pull defaults to HEAD if unspecified.
+
+When '-b' flag is specified to give a name, not an URL to the
+repository, it reads from .git/branches/<name> to get the
+repository URL, possibly immediately followed by '#' and the
+name of the head or the tag.  The latter is meant to make this
+command a bit more Cogito-user friendly.
+
+
+Author
+------
+Written by Linus Torvalds <[EMAIL PROTECTED]>
+
+Documentation
+--------------
+Documentation by David Greaves, Junio C Hamano and the git-list 
<git@vger.kernel.org>.
+
+GIT
+---
+Part of the link:git.html[git] suite
diff --git a/Documentation/git-pull-script.txt 
b/Documentation/git-pull-script.txt
--- a/Documentation/git-pull-script.txt
+++ b/Documentation/git-pull-script.txt
@@ -4,17 +4,29 @@ v0.1, May 2005
 
 NAME
 ----
-git-pull-script - Script used by Linus to pull and merge a remote repository
+git-pull-script - Pull and merge from another repository.
 
 
 SYNOPSIS
 --------
-'git-pull-script'
+'git-pull-script' <repository> [ <head> | tag <tag> ]
+
+'git-pull-script' -b <name>
+
 
 DESCRIPTION
 -----------
-This script is used by Linus to pull from a remote repository and perform
-a merge.
+Fetches a named head or a tag from another repository, along
+with the objects necessary to complete that head or tag, and
+merges it into the current repository by running
+'git-resolve-script'.  The head to pull defaults to HEAD if
+unspecified.
+
+When '-b' flag is specified to give a name, not an URL to the
+repository, it reads from .git/branches/<name> to get the
+repository URL, possibly immediately followed by '#' and the
+name of the head or the tag.  The latter is meant to make this
+command a bit more Cogito-user friendly.
 
 
 Author
diff --git a/Documentation/git.txt b/Documentation/git.txt
--- a/Documentation/git.txt
+++ b/Documentation/git.txt
@@ -121,6 +121,9 @@ The interrogate commands may create file
 touch the working file set - but in general they don't
 
 
+Synching multiple repositories
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
 link:git-clone-script.html[git-clone-script]::
        Clones a repository into the current repository (user interface)
 
@@ -128,10 +131,14 @@ link:git-clone-pack.html[git-clone-pack]
        Clones a repository into the current repository (engine
        for ssh and local transport)
 
-link:git-pull-script.html[git-pull-script]::
+link:git-fetch-script.html[git-pull-script]::
        Pull from a repote repository via various protocols
        (user interface).
 
+link:git-pull-script.html[git-pull-script]::
+       Fetch from and merge with a repote repository via
+       various protocols (user interface).
+
 link:git-http-pull.html[git-http-pull]::
        Downloads a remote GIT repository via HTTP
 
diff --git a/Documentation/tutorial.txt b/Documentation/tutorial.txt
--- a/Documentation/tutorial.txt
+++ b/Documentation/tutorial.txt
@@ -810,6 +810,19 @@ pull from:
   course, you will pay the price of more disk usage to hold
   multiple working trees, but disk space is cheap these days.  ]
 
+It is likely that you will be pulling from the same remote
+repository from time to time.  As a short hand, you can store
+the remote repository URL in a file under .git/branches/
+directory, like this:
+
+       mkdir -p .git/branches
+       echo rsync://rsync.kernel.org/pub/scm/git/git.git/ \
+           >.git/branches/linus
+
+and give "-b" option to "git pull" to use that URL:
+
+       git pull -b linus
+
 
        Publishing your work
        --------------------
diff --git a/git-fetch-script b/git-fetch-script
--- a/git-fetch-script
+++ b/git-fetch-script
@@ -1,23 +1,47 @@
 #!/bin/sh
 #
-destination=FETCH_HEAD
-
-merge_repo=$1
-merge_name=${2:-HEAD}
-if [ "$2" = "tag" ]; then
-       merge_name="refs/tags/$3"
-       destination="$merge_name"
-fi
 
 . git-sh-setup-script || die "Not a git archive"
 
+destination=FETCH_HEAD
+
+case "$1" in
+-b)
+       # Using Cogito style remote branch information.
+       # The user did not call us via git-pull, but just wants to
+       # fetch from the remote head.
+       name=$2 &&
+       destination=refs/heads/"$name" &&
+       remote_branch=$(cat "$GIT_DIR/branches/$name") ||
+       die "cannot read remote branch $name."
+       case "$remote_branch" in
+       *'#'*)
+               merge_repo=$(expr "$remote_branch" : '\(.*\)#') &&
+               merge_name=$(expr "$remote_branch" : '.*#\(.*\)$')
+               ;;
+        *)
+               merge_repo="$remote_branch" &&
+               merge_name=HEAD
+               ;;
+       esac
+       ;;
+*)
+       merge_repo=$1
+       merge_name=${2:-HEAD}
+       if [ "$2" = "tag" ]; then
+               merge_name="refs/tags/$3"
+               destination="$merge_name"
+       fi
+       ;;
+esac
+
 TMP_HEAD="$GIT_DIR/TMP_HEAD"
 
 case "$merge_repo" in
 http://*)
        head=$(wget -q -O - "$merge_repo/$merge_name") || exit 1
-       echo Fetching $head using http
-       git-http-pull -v -a "$head" "$merge_repo/"
+       echo Fetching $merge_name using http
+       git-http-pull -v -a "$merge_name" "$merge_repo/"
        ;;
 rsync://*)
        rsync -L "$merge_repo/$merge_name" "$TMP_HEAD" || exit 1
diff --git a/git-pull-script b/git-pull-script
--- a/git-pull-script
+++ b/git-pull-script
@@ -2,20 +2,48 @@
 #
 . git-sh-setup-script || die "Not a git archive"
 
-merge_repo=$1
+usage () {
+    echo >&2 "* git pull <repo> [ <head> | tag <tag> ]"
+    echo >&2 "* git pull -b <name>"
+    exit 1
+}
 
-merge_name=$(echo "$1" | sed 's:\.git/*$::')
-merge_head=HEAD
-type=head
-if [ "$2" = "tag" ]; then
-   type=tag
-   shift
-fi
-if [ "$2" ]
-then
-   merge_name="$type '$2' of $merge_name"
-   merge_head="refs/${type}s/$2"
-fi
+case "$1" in
+-b)
+       # Use Cogito style remote branch information.
+       name=$2 &&
+       remote_branch=$(cat "$GIT_DIR/branches/$name") ||
+       die "cannot read remote branch $name."
+       case "$remote_branch" in
+       *'#'*)
+               merge_repo=$(expr "$remote_branch" : '\(.*\)#') &&
+               merge_head=$(expr "$remote_branch" : '.*#\(.*\)$') &&
+               merge_name=$(echo "$merge_repo" | sed 's:\.git/*$::') &&
+               merge_name="'$merge_head' of $merge_name"
+               ;;
+        *)
+               merge_head=HEAD &&
+               merge_repo="$remote_branch" &&
+               merge_name=$(echo "$merge_repo" | sed 's:\.git/*$::')
+               ;;
+       esac
+       ;;
+*)
+       merge_repo=$1
+       merge_name=$(echo "$merge_repo" | sed 's:\.git/*$::')
+       merge_head=HEAD
+       type=head
+       if [ "$2" = "tag" ]; then
+               type=tag
+               shift
+       fi
+       if [ "$2" ]
+       then
+               merge_name="$type '$2' of $merge_name"
+               merge_head="refs/${type}s/$2"
+       fi
+       ;;
+esac
 
 git-fetch-script "$merge_repo" "$merge_head" || exit 1
 

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to