зеркало из https://github.com/microsoft/git.git
Merge branch 'jc/fetch-ignore-symref'
Avoid false error from an attempt to update local symbolic ref via fetch. * jc/fetch-ignore-symref: fetch: ignore wildcarded refspecs that update local symbolic refs
This commit is contained in:
Коммит
245d6d0064
13
remote.c
13
remote.c
|
@ -1413,6 +1413,16 @@ int branch_merge_matches(struct branch *branch,
|
||||||
return refname_match(branch->merge[i]->src, refname, ref_fetch_rules);
|
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,
|
static struct ref *get_expanded_map(const struct ref *remote_refs,
|
||||||
const struct refspec *refspec)
|
const struct refspec *refspec)
|
||||||
{
|
{
|
||||||
|
@ -1426,7 +1436,8 @@ static struct ref *get_expanded_map(const struct ref *remote_refs,
|
||||||
if (strchr(ref->name, '^'))
|
if (strchr(ref->name, '^'))
|
||||||
continue; /* a dereference item */
|
continue; /* a dereference item */
|
||||||
if (match_name_with_pattern(refspec->src, ref->name,
|
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);
|
struct ref *cpy = copy_ref(ref);
|
||||||
|
|
||||||
cpy->peer_ref = alloc_ref(expn_name);
|
cpy->peer_ref = alloc_ref(expn_name);
|
||||||
|
|
|
@ -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
|
Загрузка…
Ссылка в новой задаче