From: Sam Vilain <sam@vilain.net>
To: git@vger.kernel.org
Subject: Re: [wishlist] git branch -d -r remotename
Date: Sun, 18 Mar 2007 23:01:33 +1200 [thread overview]
Message-ID: <20070318113210.5843E13A382@magnus.utsl.gen.nz> (raw)
In-Reply-To: <20070318110507.5701413A382@magnus.utsl.gen.nz>
One time again, this time with the call to porcelain command
`git-branch` replaced with the plumbing command `symbolic-ref HEAD`
I also changed the output to be a little less "Got here\n" style.
Subject: [PATCH] git-remote: implement prune -c
It would be nice to prune local refs which are irrelevant; add an
option to git-remote prune, with documentation.
Signed-off-by: Sam Vilain <sam@vilain.net>
---
Documentation/git-remote.txt | 4 ++++
git-remote.perl | 29 +++++++++++++++++++++++++++--
2 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index ab04b86..7381b08 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -63,6 +63,10 @@ referenced by <name>, but are still locally available in
With `-n` option, the remote heads are not confirmed first with `git
ls-remote <name>`; cached information is used instead. Use with
caution.
++
+With `-c` option, all *local* branches that can be found via this
+remote are removed. Useful for cleaning up old style remote branches,
+or temporary branches.
'fetch'::
diff --git a/git-remote.perl b/git-remote.perl
index 20f9f54..0ed8a77 100755
--- a/git-remote.perl
+++ b/git-remote.perl
@@ -210,7 +210,7 @@ sub show_mapping {
}
sub prune_remote {
- my ($name, $ls_remote) = @_;
+ my ($name, $ls_remote, $clean_local) = @_;
if (!exists $remote->{$name}) {
print STDERR "No such remote $name\n";
return;
@@ -224,6 +224,28 @@ sub prune_remote {
my @v = $git->command(qw(rev-parse --verify), "$prefix/$to_prune");
$git->command(qw(update-ref -d), "$prefix/$to_prune", $v[0]);
}
+ if ( $clean_local ) {
+ my @refs = map { (split " ")[0] }
+ $git->command(qw(for-each-ref), $prefix);
+ print "fetching revs for ".@refs." remote refs\n";
+ my %r = map { ($_ => undef) }
+ $git->command("rev-list", @refs);
+ print "fetched ".(keys %r)." revs\n";
+ my %l = map { (split " ")[2,0] }
+ $git->command(qw(for-each-ref refs/heads));
+ print "checking ".(keys %l)." local heads\n";
+
+ # don't delete the current branch
+ my ($checked_out) = $git->command(qw(symbolic-ref HEAD));
+
+ while ( my ($ref, $rev) = each %l ) {
+ next if $checked_out and $ref eq $checked_out;
+ if ( exists $r{$rev} ) {
+ print "$ref is obsolete\n";
+ $git->command(qw(update-ref -d), $ref, $rev);
+ }
+ }
+ }
}
sub show_remote {
@@ -344,6 +366,9 @@ elsif ($ARGV[0] eq 'prune') {
if ($ARGV[$i] eq '-n') {
$ls_remote = 0;
}
+ elsif ($ARGV[$i] eq '-c') {
+ $clean_local = 1;
+ }
else {
last;
}
@@ -353,7 +378,7 @@ elsif ($ARGV[0] eq 'prune') {
exit(1);
}
for (; $i < @ARGV; $i++) {
- prune_remote($ARGV[$i], $ls_remote);
+ prune_remote($ARGV[$i], $ls_remote, $clean_local);
}
}
elsif ($ARGV[0] eq 'add') {
--
1.5.0.4.210.gf8a7c-dirty
next prev parent reply other threads:[~2007-03-18 11:32 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-18 9:36 [wishlist] git branch -d -r remotename Sam Vilain
2007-03-18 11:01 ` Sam Vilain
2007-03-18 11:01 ` Sam Vilain [this message]
2007-03-18 19:42 ` Junio C Hamano
2007-03-18 21:46 ` Sam Vilain
2007-03-19 6:18 ` Junio C Hamano
2007-03-19 6:40 ` Junio C Hamano
2007-03-19 23:37 ` (unknown) Sam Vilain
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070318113210.5843E13A382@magnus.utsl.gen.nz \
--to=sam@vilain.net \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).