Commit c175a7ad authored by Shawn O. Pearce's avatar Shawn O. Pearce Committed by Junio C Hamano

Make "git-remote prune" delete refs according to fetch specs

A remote may be configured to fetch into tracking branches that
do not match the remote name.  For example a user may have created
extra remotes that will fetch to the same tracking branch namespace,
but from different URLs:

  [remote "origin"]
    url = git://
    fetch = refs/heads/*:refs/remotes/origin/*

  [remote "alt"]
    url = git://
    fetch = refs/heads/*:refs/remotes/origin/*

When running `git remote prune alt` we expect stale branches to
be removed from "refs/remotes/origin/*" and not from the unused
namespace of "refs/remotes/alt/*".
Signed-off-by: default avatarShawn O. Pearce <[email protected]>
Signed-off-by: default avatarJunio C Hamano <[email protected]>
parent 6a15bc0d
......@@ -419,27 +419,10 @@ static int show_or_prune(int argc, const char **argv, int prune)
if (prune) {
struct strbuf buf;
int prefix_len;
strbuf_init(&buf, 0);
if (states.remote->fetch_refspec_nr == 1 &&
states.remote->fetch->pattern &&
/* handle --mirror remote */
strbuf_addstr(&buf, "refs/heads/");
strbuf_addf(&buf, "refs/remotes/%s/", *argv);
prefix_len = buf.len;
for (i = 0; i <; i++) {
strbuf_setlen(&buf, prefix_len);
strbuf_addstr(&buf, states.stale.items[i].path);
result |= delete_ref(buf.buf, NULL);
const char *refname = states.stale.items[i].util;
result |= delete_ref(refname, NULL);
goto cleanup_states;
......@@ -164,6 +164,24 @@ test_expect_success 'add --mirror && prune' '
git rev-parse --verify refs/heads/side)
test_expect_success 'add alt && prune' '
(mkdir alttst &&
cd alttst &&
git init &&
git remote add -f origin ../one &&
git config remote.alt.url ../one &&
git config remote.alt.fetch "+refs/heads/*:refs/remotes/origin/*") &&
(cd one &&
git branch -m side side2) &&
(cd alttst &&
git rev-parse --verify refs/remotes/origin/side &&
! git rev-parse --verify refs/remotes/origin/side2 &&
git fetch alt &&
git remote prune alt &&
! git rev-parse --verify refs/remotes/origin/side &&
git rev-parse --verify refs/remotes/origin/side2)
cat > one/expect << EOF
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment