threads / patch / 8457

patchremote: add 'rm' subcommand

Subject: [PATCH] remote: add 'rm' subcommand

## tl;dr

7 messages between Jun 5, 2007 and Sep 3, 2007. Diffs are folded; open one to read it.

replies: 6people: 3as markdown or json

James Bowes· Jun 5, 2007, 23:25 UTC · lore
Introduce git-remote rm <name> which will:
 - Remove the remote config entry for <name>.
 - Remove any config entries for tracking branches of <name>.
 - Remove any stored remote branches of <name>.
Signed-off-by: James Bowes <jbowes@dangerouslyinc.com>
---

Here's a quick patch to implement the reverse of 'git-remote add', as was asked about recently on the list[1]. Tested minimally with a collection of on-disk repositories.

If there is any interest in this, I'll follow up later with additions to the docs.

-James
[1] http://article.gmane.org/gmane.comp.version-control.git/49222
 git-remote.perl |   38 ++++++++++++++++++++++++++++++++++++++
 1 files changed, 38 insertions(+), 0 deletions(-)
Show changes to git-remote.perl +38 −0
diff --git a/git-remote.perl b/git-remote.perl
index 5763799..05aa8d6 100755
--- a/git-remote.perl
+++ b/git-remote.perl
@@ -313,6 +313,34 @@ sub update_remote {
 	}
 }
 
+sub rm_remote {
+    my ($name) = @_;
+	if (!exists $remote->{$name}) {
+		print STDERR "No such remote $name\n";
+		return;
+	}
+
+	$git->command('config', '--remove-section', "remote.$name");
+
+	eval {
+	    my @trackers = $git->command('config', '--get-regexp',
+			'branch.*.remote', $name);
+		for (@trackers) {
+			/^branch\.(.*)?\.remote/;
+			$git->config('--unset', "branch.$1.remote");
+			$git->config('--unset', "branch.$1.merge");
+		}
+	};
+
+
+    my @refs = $git->command('for-each-ref',
+		'--format=%(refname) %(objectname)', "refs/remotes/$name");
+	for (@refs) {
+		($ref, $object) = split;
+		$git->command(qw(update-ref -d), $ref, $object);
+	}
+}
+
 sub add_usage {
 	print STDERR "Usage: git remote add [-f] [-t track]* [-m master] <name> <url>\n";
 	exit(1);
@@ -403,9 +431,19 @@ elsif ($ARGV[0] eq 'add') {
 	}
 	add_remote($ARGV[1], $ARGV[2], \%opts);
 }
+elsif ($ARGV[0] eq 'rm') {
+	if (@ARGV <= 1) {
+		print STDERR "Usage: git remote rm <remote>\n";
+	}
+    else {
+        rm_remote($ARGV[1]);
+	}
+    exit(1);
+}
 else {
 	print STDERR "Usage: git remote\n";
 	print STDERR "       git remote add <name> <url>\n";
+	print STDERR "       git remote rm <name>\n";
 	print STDERR "       git remote show <name>\n";
 	print STDERR "       git remote prune <name>\n";
 	print STDERR "       git remote update [group]\n";
-- 
1.5.2.1.851.g432c
Johannes Schindelin· Jul 5, 2007, 22:38 UTC · re: James Bowes · lore

Re: [PATCH] remote: add 'rm' subcommand

Hi,
On Tue, 5 Jun 2007, James Bowes wrote:
> Introduce git-remote rm <name> which will:
>  - Remove the remote config entry for <name>.
>  - Remove any config entries for tracking branches of <name>.
>  - Remove any stored remote branches of <name>.
Any word on this?

Ciao, Dscho

James Bowes· Jul 7, 2007, 15:22 UTC · re: Johannes Schindelin · lore

[PATCH] remote: document the 'rm' subcommand

Signed-off-by: James Bowes <jbowes@dangerouslyinc.com>
---

So I still think 'git remote rm' would be nice to have. Here's a bit of documentation for it.

 Documentation/git-remote.txt |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
Show changes to Documentation/git-remote.txt +6 −0
diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
index 61a6022..fff40ca 100644
--- a/Documentation/git-remote.txt
+++ b/Documentation/git-remote.txt
@@ -11,6 +11,7 @@ SYNOPSIS
 [verse]
 'git-remote'
 'git-remote' add [-t <branch>] [-m <branch>] [-f] <name> <url>
+'git-remote' rm <name>
 'git-remote' show <name>
 'git-remote' prune <name>
 'git-remote' update [group]
@@ -46,6 +47,11 @@ With `-m <master>` option, `$GIT_DIR/remotes/<name>/HEAD` is set
 up to point at remote's `<master>` branch instead of whatever
 branch the `HEAD` at the remote repository actually points at.
 
+'rm'::
+
+Remove the remote named <name>. All remote tracking branches and
+configuration settings for the remote are removed.
+
 'show'::
 
 Gives some information about the remote <name>.
-- 
1.5.3.rc0.838.gdf39a-dirty
Johannes Schindelin· Jul 7, 2007, 16:21 UTC · re: James Bowes · lore

Re: [PATCH] remote: document the 'rm' subcommand

Hi,
On Sat, 7 Jul 2007, James Bowes wrote:
Show 5 quoted lines
> Signed-off-by: James Bowes <jbowes@dangerouslyinc.com>
> ---
> 
> So I still think 'git remote rm' would be nice to have. Here's a bit of 
> documentation for it.

Me, too. However, I would feel more comfortable with a test suite that it actually works as advertised. It is on my TODO list, which keeps growing on top of it.

Ciao, Dscho

Junio C Hamano· Jul 14, 2007, 07:41 UTC · re: Junio C Hamano · lore

Re: [PATCH] remote: document the 'rm' subcommand

Junio C Hamano <gitster@pobox.com> writes:
> Care to resend a three-patch series (implementation, this
> documentation, and test suite updates)?
It seems that this has to miss the boat for 1.5.3...
Junio C Hamano· Sep 3, 2007, 10:07 UTC · re: James Bowes · lore

Re: [PATCH] remote: add 'rm' subcommand

James Bowes <jbowes@dangerouslyinc.com> writes:
Show 6 quoted lines
> Introduce git-remote rm <name> which will:
>  - Remove the remote config entry for <name>.
>  - Remove any config entries for tracking branches of <name>.
>  - Remove any stored remote branches of <name>.
>
> Signed-off-by: James Bowes <jbowes@dangerouslyinc.com>

Let's continue with this in 1.5.4 cycle. Together with Dscho's "--mirror" patch, this will make "remote" more complete.

> If there is any interest in this, I'll follow up later with additions
> to the docs.

This is not a good thing to say here. If even the original author cannot be bothered to perfect it unconditionally (iow even when other people do not realize how useful it would be initially and nobody seem to be interested), it does not help convincing others that it is a good thing for the community to take the patch.

Show 12 quoted lines
> +sub rm_remote {
> +    my ($name) = @_;
> +	if (!exists $remote->{$name}) {
> +		print STDERR "No such remote $name\n";
> +		return;
> +	}
> +
> +	$git->command('config', '--remove-section', "remote.$name");
> +
> +	eval {
> +	    my @trackers = $git->command('config', '--get-regexp',
> +			'branch.*.remote', $name);
Is this correct, or should it be '^branch\..*\.remote$'
> +		for (@trackers) {
> +			/^branch\.(.*)?\.remote/;
And this one.  Why do we have '?' there?  Perhaps...
	if (/^branch\.(.*\)\.remote /) {
		$git->config('--unset', "branch.$1.remote");
		$git->config('--unset', "branch.$1.merge");
	} else {
        	die "Gaah, why $_ is not branch.<<name>>.remote???"
	}

We seem to have another subroutine to prune remote tracking branches, which does it slightly differently. Maybe we would want to share code with that codepath?

Other than that, I think the patch is sane, with your later "documentation patch".

We would want a handful tests, including ones to check error conditions, such as trying to remove a remote that does not exist.

← back to recent threads