Skip to content

Commit

Permalink
Teach 'git remote' how to cleanup stale tracking branches.
Browse files Browse the repository at this point in the history
Since it can be annoying to manually cleanup 40 tracking branches
which were removed by the remote system, 'git remote prune <n>'
can now be used to delete any tracking branches under <n> which
are no longer available on the remote system.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Shawn O. Pearce authored and Junio C Hamano committed Feb 2, 2007
1 parent 7a8c9ec commit 859607d
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
5 changes: 5 additions & 0 deletions Documentation/git-remote.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ SYNOPSIS
'git-remote'
'git-remote' add <name> <url>
'git-remote' show <name>
'git-remote' prune <name>

DESCRIPTION
-----------
Expand All @@ -26,6 +27,10 @@ update remote-tracking branches <name>/<branch>.

In the third form, gives some information about the remote <name>.

In the fourth form, deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

The remote configuration is achieved using the `remote.origin.url` and
`remote.origin.fetch` configuration variables. (See
gitlink:git-config[1]).
Expand Down
39 changes: 38 additions & 1 deletion git-remote.perl
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ sub show_mapping {
print " @$new\n";
}
if (@$stale) {
print " Stale tracking branches in remotes/$name (you'd better remove them)\n";
print " Stale tracking branches in remotes/$name (use 'git remote prune')\n";
print " @$stale\n";
}
if (@$tracked) {
Expand All @@ -209,6 +209,23 @@ sub show_mapping {
}
}

sub prune_remote {
my ($name, $ls_remote) = @_;
if (!exists $remote->{$name}) {
print STDERR "No such remote $name\n";
return;
}
my $info = $remote->{$name};
update_ls_remote($ls_remote, $info);

my ($new, $stale, $tracked) = list_mapping($name, $info);
my $prefix = "refs/remotes/$name";
foreach my $to_prune (@$stale) {
my @v = $git->command(qw(rev-parse --verify), "$prefix/$to_prune");
$git->command(qw(update-ref -d), "$prefix/$to_prune", $v[0]);
}
}

sub show_remote {
my ($name, $ls_remote) = @_;
if (!exists $remote->{$name}) {
Expand Down Expand Up @@ -270,6 +287,25 @@ sub add_remote {
show_remote($ARGV[$i], $ls_remote);
}
}
elsif ($ARGV[0] eq 'prune') {
my $ls_remote = 1;
my $i;
for ($i = 1; $i < @ARGV; $i++) {
if ($ARGV[$i] eq '-n') {
$ls_remote = 0;
}
else {
last;
}
}
if ($i >= @ARGV) {
print STDERR "Usage: git remote prune <remote>\n";
exit(1);
}
for (; $i < @ARGV; $i++) {
prune_remote($ARGV[$i], $ls_remote);
}
}
elsif ($ARGV[0] eq 'add') {
if (@ARGV != 3) {
print STDERR "Usage: git remote add <name> <url>\n";
Expand All @@ -281,5 +317,6 @@ sub add_remote {
print STDERR "Usage: git remote\n";
print STDERR " git remote add <name> <url>\n";
print STDERR " git remote show <name>\n";
print STDERR " git remote prune <name>\n";
exit(1);
}

0 comments on commit 859607d

Please sign in to comment.