# [PATCH] remote: add 'rm' subcommand

7 messages from 2007-06-05 to 2007-09-03. Participants: James Bowes, Johannes Schindelin, Junio C Hamano.
Thread: https://gitlist.dev/t/8457

## James Bowes, 2007-06-05 23:25

Subject: [PATCH] remote: add 'rm' subcommand
Message-ID: <11810859232541-git-send-email-jbowes@dangerouslyinc.com>
URL: https://gitlist.dev/e/11810859232541-git-send-email-jbowes%40dangerouslyinc.com

```
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(-)

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, 2007-07-05 22:38

Subject: Re: [PATCH] remote: add 'rm' subcommand
Message-ID: <Pine.LNX.4.64.0707052338150.9789@racer.site>
URL: https://gitlist.dev/e/Pine.LNX.4.64.0707052338150.9789%40racer.site
In-Reply-To: <11810859232541-git-send-email-jbowes@dangerouslyinc.com>

```
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, 2007-07-07 15:22

Subject: [PATCH] remote: document the 'rm' subcommand
Message-ID: <20070707152242.GC19782@crux.rdu.redhat.com>
URL: https://gitlist.dev/e/20070707152242.GC19782%40crux.rdu.redhat.com
In-Reply-To: <Pine.LNX.4.64.0707052338150.9789@racer.site>

```
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(-)

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, 2007-07-07 16:21

Subject: Re: [PATCH] remote: document the 'rm' subcommand
Message-ID: <Pine.LNX.4.64.0707071720490.4093@racer.site>
URL: https://gitlist.dev/e/Pine.LNX.4.64.0707071720490.4093%40racer.site
In-Reply-To: <20070707152242.GC19782@crux.rdu.redhat.com>

```
Hi,

On Sat, 7 Jul 2007, James Bowes wrote:

> 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, 2007-07-07 20:47

Subject: Re: [PATCH] remote: document the 'rm' subcommand
Message-ID: <7vodio6ivo.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7vodio6ivo.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <20070707152242.GC19782@crux.rdu.redhat.com>

```
Care to resend a three-patch series (implementation, this
documentation, and test suite updates)?

```

## Junio C Hamano, 2007-07-14 07:41

Subject: Re: [PATCH] remote: document the 'rm' subcommand
Message-ID: <7vtzs7juu5.fsf@assigned-by-dhcp.cox.net>
URL: https://gitlist.dev/e/7vtzs7juu5.fsf%40assigned-by-dhcp.cox.net
In-Reply-To: <7vodio6ivo.fsf@assigned-by-dhcp.cox.net>

```
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, 2007-09-03 10:07

Subject: Re: [PATCH] remote: add 'rm' subcommand
Message-ID: <7vy7fojc3s.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vy7fojc3s.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <11810859232541-git-send-email-jbowes@dangerouslyinc.com>

```
James Bowes <jbowes@dangerouslyinc.com> writes:

> 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.

> +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.

```
