Merge branch 'jc/fetch-ignore-symref' into maint
"git fetch --mirror" and fetch that uses other forms of refspec with wildcard used to attempt to update a symbolic ref that match the wildcard on the receiving end, which made little sense (the real ref that is pointed at by the symbolic ref would be updated anyway). Symbolic refs no longer are affected by such a fetch. * jc/fetch-ignore-symref: fetch: ignore wildcarded refspecs that update local symbolic refs
This commit is contained in:
commit
c039f35b8a
13
remote.c
13
remote.c
@ -1370,6 +1370,16 @@ int branch_merge_matches(struct branch *branch,
|
||||
return refname_match(branch->merge[i]->src, refname, ref_fetch_rules);
|
||||
}
|
||||
|
||||
static int ignore_symref_update(const char *refname)
|
||||
{
|
||||
unsigned char sha1[20];
|
||||
int flag;
|
||||
|
||||
if (!resolve_ref_unsafe(refname, sha1, 0, &flag))
|
||||
return 0; /* non-existing refs are OK */
|
||||
return (flag & REF_ISSYMREF);
|
||||
}
|
||||
|
||||
static struct ref *get_expanded_map(const struct ref *remote_refs,
|
||||
const struct refspec *refspec)
|
||||
{
|
||||
@ -1383,7 +1393,8 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
|
||||
if (strchr(ref->name, '^'))
|
||||
continue; /* a dereference item */
|
||||
if (match_name_with_pattern(refspec->src, ref->name,
|
||||
refspec->dst, &expn_name)) {
|
||||
refspec->dst, &expn_name) &&
|
||||
!ignore_symref_update(expn_name)) {
|
||||
struct ref *cpy = copy_ref(ref);
|
||||
|
||||
cpy->peer_ref = alloc_ref(expn_name);
|
||||
|
42
t/t5535-fetch-push-symref.sh
Executable file
42
t/t5535-fetch-push-symref.sh
Executable file
@ -0,0 +1,42 @@
|
||||
#!/bin/sh
|
||||
|
||||
test_description='avoiding conflicting update thru symref aliasing'
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
test_commit one &&
|
||||
git clone . src &&
|
||||
git clone src dst1 &&
|
||||
git clone src dst2 &&
|
||||
test_commit two &&
|
||||
( cd src && git pull )
|
||||
'
|
||||
|
||||
test_expect_success 'push' '
|
||||
(
|
||||
cd src &&
|
||||
git push ../dst1 "refs/remotes/*:refs/remotes/*"
|
||||
) &&
|
||||
git ls-remote src "refs/remotes/*" >expect &&
|
||||
git ls-remote dst1 "refs/remotes/*" >actual &&
|
||||
test_cmp expect actual &&
|
||||
( cd src && git symbolic-ref refs/remotes/origin/HEAD ) >expect &&
|
||||
( cd dst1 && git symbolic-ref refs/remotes/origin/HEAD ) >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'fetch' '
|
||||
(
|
||||
cd dst2 &&
|
||||
git fetch ../src "refs/remotes/*:refs/remotes/*"
|
||||
) &&
|
||||
git ls-remote src "refs/remotes/*" >expect &&
|
||||
git ls-remote dst2 "refs/remotes/*" >actual &&
|
||||
test_cmp expect actual &&
|
||||
( cd src && git symbolic-ref refs/remotes/origin/HEAD ) >expect &&
|
||||
( cd dst2 && git symbolic-ref refs/remotes/origin/HEAD ) >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_done
|
Loading…
Reference in New Issue
Block a user