# [PATCH] fetch/parse-remote: refs/remotes/* support

5 messages from 2006-03-09 to 2006-03-10. Participants: Eric Wong, Junio C Hamano.
Thread: https://gitlist.dev/t/3609

## Eric Wong, 2006-03-09 11:54

Subject: [PATCH] fetch/parse-remote: refs/remotes/* support
Message-ID: <20060309115452.GA13369@localdomain>
URL: https://gitlist.dev/e/20060309115452.GA13369%40localdomain

```
Signed-off-by: Eric Wong <normalperson@yhbt.net>

---

 git-fetch.sh        |    5 ++++-
 git-parse-remote.sh |    8 ++++----
 2 files changed, 8 insertions(+), 5 deletions(-)

34f9d6c64bd686f29db4cd410882aab607e1b628
diff --git a/git-fetch.sh b/git-fetch.sh
index 0346d4a..2748573 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -103,6 +103,9 @@ append_fetch_head () {
     refs/tags/*)
 	note_="$(expr "$remote_name_" : 'refs/tags/\(.*\)')"
 	note_="tag '$note_' of " ;;
+    refs/remotes/*)
+	note_="$(expr "$remote_name_" : 'refs/remotes/\(.*\)')"
+	note_="remote branch '$note_' of " ;;
     *)
 	note_="$remote_name of " ;;
     esac
@@ -150,7 +153,7 @@ fast_forward_local () {
 	git-update-ref "$1" "$2" 
 	;;
 
-    refs/heads/*)
+    refs/heads/* | refs/remotes/*)
 	# $1 is the ref being updated.
 	# $2 is the new value for the ref.
 	local=$(git-rev-parse --verify "$1^0" 2>/dev/null)
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 5f158c6..63f2281 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -86,14 +86,14 @@ canon_refs_list_for_fetch () {
 		local=$(expr "$ref" : '[^:]*:\(.*\)')
 		case "$remote" in
 		'') remote=HEAD ;;
-		refs/heads/* | refs/tags/*) ;;
-		heads/* | tags/* ) remote="refs/$remote" ;;
+		refs/heads/* | refs/tags/* | refs/remotes/*) ;;
+		heads/* | tags/* | remotes/* ) remote="refs/$remote" ;;
 		*) remote="refs/heads/$remote" ;;
 		esac
 		case "$local" in
 		'') local= ;;
-		refs/heads/* | refs/tags/*) ;;
-		heads/* | tags/* ) local="refs/$local" ;;
+		refs/heads/* | refs/tags/* | refs/remotes/*) ;;
+		heads/* | tags/* | remotes/* ) local="refs/$local" ;;
 		*) local="refs/heads/$local" ;;
 		esac
 
-- 
1.2.4.ga2910

```

## Eric Wong, 2006-03-09 11:55

Subject: [PATCH] clone: add refs/remotes/* to Pull: targets when cloning
Message-ID: <20060309115535.GB13369@localdomain>
URL: https://gitlist.dev/e/20060309115535.GB13369%40localdomain
In-Reply-To: <20060309115452.GA13369@localdomain>

```
Signed-off-by: Eric Wong <normalperson@yhbt.net>

---

 git-clone.sh |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)

be2db2344099b3713c1136e84bab7390b6198895
diff --git a/git-clone.sh b/git-clone.sh
index 4ed861d..a8ab7fd 100755
--- a/git-clone.sh
+++ b/git-clone.sh
@@ -249,6 +249,12 @@ Pull: $head_points_at:$origin" &&
 			test "$origin" = "$head" ||
 			echo "Pull: ${head}:${head}"
 		done >>"$GIT_DIR/remotes/origin"
+		(test -d "$GIT_DIR"/refs/remotes && cd "$GIT_DIR" &&
+		 find "refs/remotes" -type f -print | sed -e 's|^refs/||') |
+		while read ref
+		do
+			echo "Pull: $ref:$ref"
+		done >>"$GIT_DIR/remotes/origin"
 	esac
 
 	case "$no_checkout" in
-- 
1.2.4.ga2910

```

## Junio C Hamano, 2006-03-09 17:23

Subject: Re: [PATCH] fetch/parse-remote: refs/remotes/* support
Message-ID: <7vzmjz5y6o.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7vzmjz5y6o.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <20060309115452.GA13369@localdomain>

```

> @@ -103,6 +103,9 @@ append_fetch_head () {
>      refs/tags/*)
>  	note_="$(expr "$remote_name_" : 'refs/tags/\(.*\)')"
>  	note_="tag '$note_' of " ;;
> +    refs/remotes/*)
> +	note_="$(expr "$remote_name_" : 'refs/remotes/\(.*\)')"
> +	note_="remote branch '$note_' of " ;;
>      *)
>  	note_="$remote_name of " ;;
>      esac

I vaguely recall that if you touch this part of the code you
would also need to check if fmt-merge-msg does sensible thing
for it.

```

## Junio C Hamano, 2006-03-09 18:23

Subject: Re: [PATCH] clone: add refs/remotes/* to Pull: targets when cloning
Message-ID: <7vfylr5vfs.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7vfylr5vfs.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <20060309115535.GB13369@localdomain>

```
Eric Wong <normalperson@yhbt.net> writes:

> diff --git a/git-clone.sh b/git-clone.sh
> index 4ed861d..a8ab7fd 100755
> --- a/git-clone.sh
> +++ b/git-clone.sh
> @@ -249,6 +249,12 @@ Pull: $head_points_at:$origin" &&
>  			test "$origin" = "$head" ||
>  			echo "Pull: ${head}:${head}"
>  		done >>"$GIT_DIR/remotes/origin"
> +		(test -d "$GIT_DIR"/refs/remotes && cd "$GIT_DIR" &&
> +		 find "refs/remotes" -type f -print | sed -e 's|^refs/||') |
> +		while read ref
> +		do
> +			echo "Pull: $ref:$ref"
> +		done >>"$GIT_DIR/remotes/origin"
>  	esac

I am not sure I agree with what you are doing here.  I thought
the idea behind refs/remotes is to migrate away from copying all
the remote heads into refs/heads (so that Linus does not need to
see my "next" and "pu" under his refs/heads), and putting
foreign SCM tracking branches used by SVN and CVS importers in
there instead of in refs/heads naturally falls out from that
pattern.

Now I do not propose to change the current clone that
contaminates the local branch namespace by copying remote
refs/heads into local refs/heads in the middle of v1.3.0
development without laying out a transition plan, but I think
that is a sensible future direction.  Instead of copying
everything from refs/heads to refs/heads, we only copy what
remote HEAD points at to refs/heads/master to initialize the
local clone, and copy everything from refs/heads to
refs/remotes, _and_ set up Pull: lines to do the same tracking.
The part of the code you are touching corresponds to the last
part.

We would probably be better off not doing this right now.  When
we are sure everybody thinks it is a better approach to use
refs/remotes for remote branch tracking, we would need to change
the part you did not change (I think the clone-pack part is the
hardest to change since it has a built-in "copy refs to matching
locations" logic) alongside with the part you touched with this
patch to make things consistent.  At that time also you would
need to remove several lines above the part you touched so that
we do not use local refs/heads/* for tracking.

How does that sound?

```

## Eric Wong, 2006-03-10 12:19

Subject: [PATCH] fetch,parse-remote,fmt-merge-msg: refs/remotes/* support
Message-ID: <20060310121907.GA15746@localdomain>
URL: https://gitlist.dev/e/20060310121907.GA15746%40localdomain
In-Reply-To: <7vzmjz5y6o.fsf@assigned-by-dhcp.cox.net>

```
Note: This replaces the previous patch to fetch and parse-remote.

We can now easily fetch and merge things from heads in the
refs/remotes/ hierarchy in remote repositories.

The refs/remotes/ hierarchy is likely to become the standard for
tracking foreign SCMs, as well as the location of Pull: targets
for non-master heads of newly cloned repositories.

Signed-off-by: Eric Wong <normalperson@yhbt.net>

---

 git-fetch.sh           |    8 +++++++-
 git-fmt-merge-msg.perl |    8 ++++++++
 git-parse-remote.sh    |    8 ++++----
 3 files changed, 19 insertions(+), 5 deletions(-)

6697c83da96b26739c3fe33c8526da6124cea909
diff --git a/git-fetch.sh b/git-fetch.sh
index 0346d4a..11e9a9d 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -94,6 +94,9 @@ append_fetch_head () {
     # remote-nick is the URL given on the command line (or a shorthand)
     # remote-name is the $GIT_DIR relative refs/ path we computed
     # for this refspec.
+
+    # the $note_ variable will be fed to git-fmt-merge-msg for further
+    # processing.
     case "$remote_name_" in
     HEAD)
 	note_= ;;
@@ -103,6 +106,9 @@ append_fetch_head () {
     refs/tags/*)
 	note_="$(expr "$remote_name_" : 'refs/tags/\(.*\)')"
 	note_="tag '$note_' of " ;;
+    refs/remotes/*)
+	note_="$(expr "$remote_name_" : 'refs/\(remotes/.*\)')"
+	note_="remote branch '$note_' of " ;;
     *)
 	note_="$remote_name of " ;;
     esac
@@ -150,7 +156,7 @@ fast_forward_local () {
 	git-update-ref "$1" "$2" 
 	;;
 
-    refs/heads/*)
+    refs/heads/* | refs/remotes/*)
 	# $1 is the ref being updated.
 	# $2 is the new value for the ref.
 	local=$(git-rev-parse --verify "$1^0" 2>/dev/null)
diff --git a/git-fmt-merge-msg.perl b/git-fmt-merge-msg.perl
index afe80e6..5986e54 100755
--- a/git-fmt-merge-msg.perl
+++ b/git-fmt-merge-msg.perl
@@ -75,6 +75,7 @@ while (<>) {
 		$src{$src} = {
 			BRANCH => [],
 			TAG => [],
+			R_BRANCH => [],
 			GENERIC => [],
 			# &1 == has HEAD.
 			# &2 == has others.
@@ -91,6 +92,11 @@ while (<>) {
 		push @{$src{$src}{TAG}}, $1;
 		$src{$src}{HEAD_STATUS} |= 2;
 	}
+	elsif (/^remote branch (.*)$/) {
+		$origin = $1;
+		push @{$src{$src}{R_BRANCH}}, $1;
+		$src{$src}{HEAD_STATUS} |= 2;
+	}
 	elsif (/^HEAD$/) {
 		$origin = $src;
 		$src{$src}{HEAD_STATUS} |= 1;
@@ -123,6 +129,8 @@ for my $src (@src) {
 	}
 	push @this, andjoin("branch ", "branches ",
 			   $src{$src}{BRANCH});
+	push @this, andjoin("remote branch ", "remote branches ",
+			   $src{$src}{R_BRANCH});
 	push @this, andjoin("tag ", "tags ",
 			   $src{$src}{TAG});
 	push @this, andjoin("commit ", "commits ",
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index 5f158c6..63f2281 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -86,14 +86,14 @@ canon_refs_list_for_fetch () {
 		local=$(expr "$ref" : '[^:]*:\(.*\)')
 		case "$remote" in
 		'') remote=HEAD ;;
-		refs/heads/* | refs/tags/*) ;;
-		heads/* | tags/* ) remote="refs/$remote" ;;
+		refs/heads/* | refs/tags/* | refs/remotes/*) ;;
+		heads/* | tags/* | remotes/* ) remote="refs/$remote" ;;
 		*) remote="refs/heads/$remote" ;;
 		esac
 		case "$local" in
 		'') local= ;;
-		refs/heads/* | refs/tags/*) ;;
-		heads/* | tags/* ) local="refs/$local" ;;
+		refs/heads/* | refs/tags/* | refs/remotes/*) ;;
+		heads/* | tags/* | remotes/* ) local="refs/$local" ;;
 		*) local="refs/heads/$local" ;;
 		esac
 
-- 
1.2.4.gbe2d

```
