diff options
author | Junio C Hamano <junkio@cox.net> | 2007-02-04 03:25:12 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2007-02-04 03:28:15 -0800 |
commit | 1f7d1a53fed40608e76200f941e6689b53752747 (patch) | |
tree | 51e02160b52ef0f938a82a1eb9bbe776bab7c4f2 /git-clone.sh | |
parent | ec8048913217d8ff6e54950a0cb8ab2e739a1d1f (diff) | |
download | git-1f7d1a53fed40608e76200f941e6689b53752747.tar.gz git-1f7d1a53fed40608e76200f941e6689b53752747.tar.xz |
git-clone --reference: saner handling of borrowed symrefs.
When using --reference to borrow objects from a neighbouring
repository while cloning, we copy the entire set of refs under
temporary "refs/reference-tmp/refs" space and set up the object
alternates. However, a textual symref copied this way would not
point at the right place, and causes later steps to emit error
messages (which is harmless but still alarming). This is most
visible when using a clone created with the separate-remote
layout as a reference, because such a repository would have
refs/remotes/origin/HEAD with 'ref: refs/remotes/origin/master'
as its contents.
Although we do not create symbolic-link based refs anymore, they
have the same problem because they are always supposed to be
relative to refs/ hierarchy (we dereference by hand, so it only
is good for HEAD and nothing else).
In either case, the solution is simply to remove them after
copying under refs/reference-tmp; if a symref points at a true
ref, that true ref itself is enough to ensure that objects
reachable from it do not needlessly get fetched.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'git-clone.sh')
-rwxr-xr-x | git-clone.sh | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/git-clone.sh b/git-clone.sh index 4ddfa774e..171099674 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -190,7 +190,34 @@ then (cd "$GIT_DIR/refs" && mkdir reference-tmp && cd reference-tmp && - tar xf -) + tar xf - && + find refs ! -type d -print | + while read ref + do + if test -h "$ref" + then + # Old-style symbolic link ref. Not likely + # to appear under refs/ but we might as well + # deal with them. + : + elif test -f "$ref" + then + point=$(cat "$ref") && + case "$point" in + 'ref: '*) ;; + *) continue ;; + esac + fi + # The above makes true ref to 'continue' and + # we will come here when we are looking at + # symbolic link ref or a textual symref (or + # garbage, like fifo). + # The true ref pointed at by it is enough to + # ensure that we do not fetch objects reachable + # from it. + rm -f "$ref" + done + ) else die "reference repository '$reference' is not a local directory." fi |