[v4,4/7] remote rename/remove: handle branch.<name>.pushRemote config values
diff mbox series

Message ID 9c2110eda64ab7bf0cb780dafe1f13b28fee5ca0.1579857394.git.bert.wesarg@googlemail.com
State New
Headers show
Series
  • remote rename/remove: improve handling of configuration values
Related show

Commit Message

Bert Wesarg Jan. 24, 2020, 9:25 a.m. UTC
When renaming or removing a remote with

    git remote rename X Y
    git remote remove X

Git already renames/removes any config values from

    branch.<name>.remote = X

to

    branch.<name>.remote = Y

As branch.<name>.pushRemote also names a remote, it now also renames
or removes these config values from

    branch.<name>.pushRemote = X

to

    branch.<name>.pushRemote = Y

Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>

---

Changes since v3:

 * handle also 'git remote remove'

Cc: Junio C Hamano <gitster@pobox.com>
Cc: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 builtin/remote.c  | 22 +++++++++++++++++++++-
 t/t5505-remote.sh | 16 +++++++++++++++-
 2 files changed, 36 insertions(+), 2 deletions(-)

Comments

Johannes Schindelin Jan. 25, 2020, 12:46 a.m. UTC | #1
Hi Bert,

On Fri, 24 Jan 2020, Bert Wesarg wrote:

> When renaming or removing a remote with
>
>     git remote rename X Y
>     git remote remove X
>
> Git already renames/removes any config values from
>
>     branch.<name>.remote = X
>
> to
>
>     branch.<name>.remote = Y
>
> As branch.<name>.pushRemote also names a remote, it now also renames
> or removes these config values from
>
>     branch.<name>.pushRemote = X
>
> to
>
>     branch.<name>.pushRemote = Y
>
> Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
>
> ---

This commit seems to cause a failure in t5505:
https://dev.azure.com/gitgitgadget/git/_build/results?buildId=27833&view=ms.vss-test-web.build-test-results-tab

Here is the excerpt of the log:

-- snip --
[...]
expecting success of 5505.15 'show':
	(
		cd test &&
		git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream &&
		git fetch &&
		git checkout -b ahead origin/master &&
		echo 1 >>file &&
		test_tick &&
		git commit -m update file &&
		git checkout master &&
		git branch --track octopus origin/master &&
		git branch --track rebase origin/master &&
		git branch -d -r origin/master &&
		git config --add remote.two.url ../two &&
		git config --add remote.two.pushurl ../three &&
		git config branch.rebase.rebase true &&
		git config branch.octopus.merge "topic-a topic-b topic-c" &&
		(
			cd ../one &&
			echo 1 >file &&
			test_tick &&
			git commit -m update file
		) &&
		git config --add remote.origin.push : &&
		git config --add remote.origin.push refs/heads/master:refs/heads/upstream &&
		git config --add remote.origin.push +refs/tags/lastbackup &&
		git config --add remote.two.push +refs/heads/ahead:refs/heads/master &&
		git config --add remote.two.push refs/heads/master:refs/heads/another &&
		git remote show origin two >output &&
		git branch -d rebase octopus &&
		test_i18ncmp expect output
	)

+ cd test
+ git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream
+ git fetch
From /home/virtualbox/git/t/trash directory.t5505-remote/one
 * [new branch]      master     -> upstream
+ git checkout -b ahead origin/master
Switched to a new branch 'ahead'
Branch 'ahead' set up to track remote branch 'master' from 'origin'.
+ echo 1
+ test_tick
+ test -z
+ test_tick=1112911993
+ GIT_COMMITTER_DATE=1112911993 -0700
+ GIT_AUTHOR_DATE=1112911993 -0700
+ export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
+ git commit -m update file
[ahead 847549e] update
 Author: A U Thor <author@example.com>
 1 file changed, 1 insertion(+)
+ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
+ git branch --track octopus origin/master
Branch 'octopus' set up to track remote branch 'master' from 'origin'.
+ git branch --track rebase origin/master
Branch 'rebase' set up to track remote branch 'master' from 'origin'.
+ git branch -d -r origin/master
Deleted remote-tracking branch origin/master (was 9d34b14).
+ git config --add remote.two.url ../two
+ git config --add remote.two.pushurl ../three
+ git config branch.rebase.rebase true
+ git config branch.octopus.merge topic-a topic-b topic-c
+ cd ../one
+ echo 1
+ test_tick
+ test -z set
+ test_tick=1112912053
+ GIT_COMMITTER_DATE=1112912053 -0700
+ GIT_AUTHOR_DATE=1112912053 -0700
+ export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
+ git commit -m update file
[master 6329a3c] update
 Author: A U Thor <author@example.com>
 1 file changed, 1 insertion(+)
+ git config --add remote.origin.push :
+ git config --add remote.origin.push refs/heads/master:refs/heads/upstream
+ git config --add remote.origin.push +refs/tags/lastbackup
+ git config --add remote.two.push +refs/heads/ahead:refs/heads/master
+ git config --add remote.two.push refs/heads/master:refs/heads/another
+ git remote show origin two
error: src refspec refs/tags/lastbackup does not match any
+ git branch -d rebase octopus
Deleted branch rebase (was 9d34b14).
Deleted branch octopus (was 9d34b14).
+ test_i18ncmp expect output
+ test_have_prereq C_LOCALE_OUTPUT
+ save_IFS=

+ IFS=,
+ set -- C_LOCALE_OUTPUT
+ IFS=

+ total_prereq=0
+ ok_prereq=0
+ missing_prereq=
+ negative_prereq=
+ total_prereq=1
+ satisfied_this_prereq=t
+ ok_prereq=1
+ test 1 = 1
+ test_cmp expect output
+ diff -u expect output
--- expect	2020-01-25 00:44:41.496720000 +0000
+++ output	2020-01-25 00:44:43.513861900 +0000
@@ -5,13 +5,6 @@
   Remote branches:
     master new (next fetch will store in remotes/origin)
     side   tracked
-  Local branches configured for 'git pull':
-    ahead    merges with remote master
-    master   merges with remote master
-    octopus  merges with remote topic-a
-                and with remote topic-b
-                and with remote topic-c
-    rebase  rebases onto remote master
   Local refs configured for 'git push':
     master pushes to master   (local out of date)
     master pushes to upstream (create)
error: last command exited with $?=1
not ok 15 - show
#
#		(
#			cd test &&
#			git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream &&
#			git fetch &&
#			git checkout -b ahead origin/master &&
#			echo 1 >>file &&
#			test_tick &&
#			git commit -m update file &&
#			git checkout master &&
#			git branch --track octopus origin/master &&
#			git branch --track rebase origin/master &&
#			git branch -d -r origin/master &&
#			git config --add remote.two.url ../two &&
#			git config --add remote.two.pushurl ../three &&
#			git config branch.rebase.rebase true &&
#			git config branch.octopus.merge "topic-a topic-b topic-c" &&
#			(
#				cd ../one &&
#				echo 1 >file &&
#				test_tick &&
#				git commit -m update file
#			) &&
#			git config --add remote.origin.push : &&
#			git config --add remote.origin.push refs/heads/master:refs/heads/upstream &&
#			git config --add remote.origin.push +refs/tags/lastbackup &&
#			git config --add remote.two.push +refs/heads/ahead:refs/heads/master &&
#			git config --add remote.two.push refs/heads/master:refs/heads/another &&
#			git remote show origin two >output &&
#			git branch -d rebase octopus &&
#			test_i18ncmp expect output
#		)
#
-- snap --

Could you have a look to see whether the code or the test need to be
adjusted?

Thanks,
Dscho

>
> Changes since v3:
>
>  * handle also 'git remote remove'
>
> Cc: Junio C Hamano <gitster@pobox.com>
> Cc: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
>  builtin/remote.c  | 22 +++++++++++++++++++++-
>  t/t5505-remote.sh | 16 +++++++++++++++-
>  2 files changed, 36 insertions(+), 2 deletions(-)
>
> diff --git a/builtin/remote.c b/builtin/remote.c
> index 9ee44c9f6c..a2379a14bf 100644
> --- a/builtin/remote.c
> +++ b/builtin/remote.c
> @@ -250,6 +250,7 @@ struct branch_info {
>  	char *remote_name;
>  	struct string_list merge;
>  	enum rebase_type rebase;
> +	char *push_remote_name;
>  };
>
>  static struct string_list branch_list = STRING_LIST_INIT_NODUP;
> @@ -267,7 +268,7 @@ static int config_read_branches(const char *key, const char *value, void *cb)
>  	char *name;
>  	struct string_list_item *item;
>  	struct branch_info *info;
> -	enum { REMOTE, MERGE, REBASE } type;
> +	enum { REMOTE, MERGE, REBASE, PUSH_REMOTE } type;
>  	size_t key_len;
>
>  	if (!starts_with(key, "branch."))
> @@ -280,6 +281,8 @@ static int config_read_branches(const char *key, const char *value, void *cb)
>  		type = MERGE;
>  	else if (strip_suffix(key, ".rebase", &key_len))
>  		type = REBASE;
> +	else if (strip_suffix(key, ".pushremote", &key_len))
> +		type = PUSH_REMOTE;
>  	else
>  		return 0;
>  	name = xmemdupz(key, key_len);
> @@ -315,6 +318,11 @@ static int config_read_branches(const char *key, const char *value, void *cb)
>  		 */
>  		info->rebase = rebase_parse_value(value);
>  		break;
> +	case PUSH_REMOTE:
> +		if (info->push_remote_name)
> +			warning(_("more than one %s"), orig_key);
> +		info->push_remote_name = xstrdup(value);
> +		break;
>  	default:
>  		BUG("unexpected type=%d", type);
>  	}
> @@ -682,6 +690,11 @@ static int mv(int argc, const char **argv)
>  			strbuf_addf(&buf, "branch.%s.remote", item->string);
>  			git_config_set(buf.buf, rename.new_name);
>  		}
> +		if (info->push_remote_name && !strcmp(info->push_remote_name, rename.old_name)) {
> +			strbuf_reset(&buf);
> +			strbuf_addf(&buf, "branch.%s.pushremote", item->string);
> +			git_config_set(buf.buf, rename.new_name);
> +		}
>  	}
>
>  	if (!refspec_updated)
> @@ -783,6 +796,13 @@ static int rm(int argc, const char **argv)
>  					die(_("could not unset '%s'"), buf.buf);
>  			}
>  		}
> +		if (info->push_remote_name && !strcmp(info->push_remote_name, remote->name)) {
> +			strbuf_reset(&buf);
> +			strbuf_addf(&buf, "branch.%s.pushremote", item->string);
> +			result = git_config_set_gently(buf.buf, NULL);
> +			if (result && result != CONFIG_NOTHING_SET)
> +				die(_("could not unset '%s'"), buf.buf);
> +		}
>  	}
>
>  	/*
> diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
> index 883b32efa0..082042b05a 100755
> --- a/t/t5505-remote.sh
> +++ b/t/t5505-remote.sh
> @@ -737,12 +737,14 @@ test_expect_success 'rename a remote' '
>  	git clone one four &&
>  	(
>  		cd four &&
> +		git config branch.master.pushRemote origin &&
>  		git remote rename origin upstream &&
>  		test -z "$(git for-each-ref refs/remotes/origin)" &&
>  		test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/master" &&
>  		test "$(git rev-parse upstream/master)" = "$(git rev-parse master)" &&
>  		test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*" &&
> -		test "$(git config branch.master.remote)" = "upstream"
> +		test "$(git config branch.master.remote)" = "upstream" &&
> +		test "$(git config branch.master.pushRemote)" = "upstream"
>  	)
>  '
>
> @@ -784,6 +786,18 @@ test_expect_success 'rename succeeds with existing remote.<target>.prune' '
>  	git -C four.four remote rename origin upstream
>  '
>
> +test_expect_success 'remove a remote' '
> +	git clone one four.five &&
> +	(
> +		cd four.five &&
> +		git config branch.master.pushRemote origin &&
> +		git remote remove origin &&
> +		test -z "$(git for-each-ref refs/remotes/origin)" &&
> +		test_must_fail git config branch.master.remote &&
> +		test_must_fail git config branch.master.pushRemote
> +	)
> +'
> +
>  cat >remotes_origin <<EOF
>  URL: $(pwd)/one
>  Push: refs/heads/master:refs/heads/upstream
> --
> 2.24.1.497.g9abd7b20b4.dirty
>
>
Bert Wesarg Jan. 25, 2020, 7:29 a.m. UTC | #2
Dear Dscho,

On 25.01.20 01:46, Johannes Schindelin wrote:
> Hi Bert,
> 
> On Fri, 24 Jan 2020, Bert Wesarg wrote:
> 
>> When renaming or removing a remote with
>>
>>      git remote rename X Y
>>      git remote remove X
>>
>> Git already renames/removes any config values from
>>
>>      branch.<name>.remote = X
>>
>> to
>>
>>      branch.<name>.remote = Y
>>
>> As branch.<name>.pushRemote also names a remote, it now also renames
>> or removes these config values from
>>
>>      branch.<name>.pushRemote = X
>>
>> to
>>
>>      branch.<name>.pushRemote = Y
>>
>> Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
>>
>> ---
> 
> This commit seems to cause a failure in t5505:
> https://dev.azure.com/gitgitgadget/git/_build/results?buildId=27833&view=ms.vss-test-web.build-test-results-tab
> 
> Here is the excerpt of the log:
> 
> -- snip --
> [...]
> expecting success of 5505.15 'show':
> 	(
> 		cd test &&
> 		git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream &&
> 		git fetch &&
> 		git checkout -b ahead origin/master &&
> 		echo 1 >>file &&
> 		test_tick &&
> 		git commit -m update file &&
> 		git checkout master &&
> 		git branch --track octopus origin/master &&
> 		git branch --track rebase origin/master &&
> 		git branch -d -r origin/master &&
> 		git config --add remote.two.url ../two &&
> 		git config --add remote.two.pushurl ../three &&
> 		git config branch.rebase.rebase true &&
> 		git config branch.octopus.merge "topic-a topic-b topic-c" &&
> 		(
> 			cd ../one &&
> 			echo 1 >file &&
> 			test_tick &&
> 			git commit -m update file
> 		) &&
> 		git config --add remote.origin.push : &&
> 		git config --add remote.origin.push refs/heads/master:refs/heads/upstream &&
> 		git config --add remote.origin.push +refs/tags/lastbackup &&
> 		git config --add remote.two.push +refs/heads/ahead:refs/heads/master &&
> 		git config --add remote.two.push refs/heads/master:refs/heads/another &&
> 		git remote show origin two >output &&
> 		git branch -d rebase octopus &&
> 		test_i18ncmp expect output
> 	)
> 
> + cd test
> + git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream
> + git fetch
>  From /home/virtualbox/git/t/trash directory.t5505-remote/one
>   * [new branch]      master     -> upstream
> + git checkout -b ahead origin/master
> Switched to a new branch 'ahead'
> Branch 'ahead' set up to track remote branch 'master' from 'origin'.
> + echo 1
> + test_tick
> + test -z
> + test_tick=1112911993
> + GIT_COMMITTER_DATE=1112911993 -0700
> + GIT_AUTHOR_DATE=1112911993 -0700
> + export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
> + git commit -m update file
> [ahead 847549e] update
>   Author: A U Thor <author@example.com>
>   1 file changed, 1 insertion(+)
> + git checkout master
> Switched to branch 'master'
> Your branch is up to date with 'origin/master'.
> + git branch --track octopus origin/master
> Branch 'octopus' set up to track remote branch 'master' from 'origin'.
> + git branch --track rebase origin/master
> Branch 'rebase' set up to track remote branch 'master' from 'origin'.
> + git branch -d -r origin/master
> Deleted remote-tracking branch origin/master (was 9d34b14).
> + git config --add remote.two.url ../two
> + git config --add remote.two.pushurl ../three
> + git config branch.rebase.rebase true
> + git config branch.octopus.merge topic-a topic-b topic-c
> + cd ../one
> + echo 1
> + test_tick
> + test -z set
> + test_tick=1112912053
> + GIT_COMMITTER_DATE=1112912053 -0700
> + GIT_AUTHOR_DATE=1112912053 -0700
> + export GIT_COMMITTER_DATE GIT_AUTHOR_DATE
> + git commit -m update file
> [master 6329a3c] update
>   Author: A U Thor <author@example.com>
>   1 file changed, 1 insertion(+)
> + git config --add remote.origin.push :
> + git config --add remote.origin.push refs/heads/master:refs/heads/upstream
> + git config --add remote.origin.push +refs/tags/lastbackup
> + git config --add remote.two.push +refs/heads/ahead:refs/heads/master
> + git config --add remote.two.push refs/heads/master:refs/heads/another
> + git remote show origin two
> error: src refspec refs/tags/lastbackup does not match any
> + git branch -d rebase octopus
> Deleted branch rebase (was 9d34b14).
> Deleted branch octopus (was 9d34b14).
> + test_i18ncmp expect output
> + test_have_prereq C_LOCALE_OUTPUT
> + save_IFS=
> 
> + IFS=,
> + set -- C_LOCALE_OUTPUT
> + IFS=
> 
> + total_prereq=0
> + ok_prereq=0
> + missing_prereq=
> + negative_prereq=
> + total_prereq=1
> + satisfied_this_prereq=t
> + ok_prereq=1
> + test 1 = 1
> + test_cmp expect output
> + diff -u expect output
> --- expect	2020-01-25 00:44:41.496720000 +0000
> +++ output	2020-01-25 00:44:43.513861900 +0000
> @@ -5,13 +5,6 @@
>     Remote branches:
>       master new (next fetch will store in remotes/origin)
>       side   tracked
> -  Local branches configured for 'git pull':
> -    ahead    merges with remote master
> -    master   merges with remote master
> -    octopus  merges with remote topic-a
> -                and with remote topic-b
> -                and with remote topic-c
> -    rebase  rebases onto remote master
>     Local refs configured for 'git push':
>       master pushes to master   (local out of date)
>       master pushes to upstream (create)
> error: last command exited with $?=1
> not ok 15 - show
> #
> #		(
> #			cd test &&
> #			git config --add remote.origin.fetch refs/heads/master:refs/heads/upstream &&
> #			git fetch &&
> #			git checkout -b ahead origin/master &&
> #			echo 1 >>file &&
> #			test_tick &&
> #			git commit -m update file &&
> #			git checkout master &&
> #			git branch --track octopus origin/master &&
> #			git branch --track rebase origin/master &&
> #			git branch -d -r origin/master &&
> #			git config --add remote.two.url ../two &&
> #			git config --add remote.two.pushurl ../three &&
> #			git config branch.rebase.rebase true &&
> #			git config branch.octopus.merge "topic-a topic-b topic-c" &&
> #			(
> #				cd ../one &&
> #				echo 1 >file &&
> #				test_tick &&
> #				git commit -m update file
> #			) &&
> #			git config --add remote.origin.push : &&
> #			git config --add remote.origin.push refs/heads/master:refs/heads/upstream &&
> #			git config --add remote.origin.push +refs/tags/lastbackup &&
> #			git config --add remote.two.push +refs/heads/ahead:refs/heads/master &&
> #			git config --add remote.two.push refs/heads/master:refs/heads/another &&
> #			git remote show origin two >output &&
> #			git branch -d rebase octopus &&
> #			test_i18ncmp expect output
> #		)
> #
> -- snap --
> 
> Could you have a look to see whether the code or the test need to be
> adjusted?

please ensure that you have v4 of this patch. What you see was a bug in v3.

Thanks.

Bert

> 
> Thanks,
> Dscho
>
Johannes Schindelin Jan. 26, 2020, 9:30 a.m. UTC | #3
Hi Bert,

On Sat, 25 Jan 2020, Bert Wesarg wrote:

> On 25.01.20 01:46, Johannes Schindelin wrote:
> > Hi Bert,
> >
> > On Fri, 24 Jan 2020, Bert Wesarg wrote:
> >
> > > When renaming or removing a remote with
> > >
> > >      git remote rename X Y
> > >      git remote remove X
> > >
> > > Git already renames/removes any config values from
> > >
> > >      branch.<name>.remote = X
> > >
> > > to
> > >
> > >      branch.<name>.remote = Y
> > >
> > > As branch.<name>.pushRemote also names a remote, it now also renames
> > > or removes these config values from
> > >
> > >      branch.<name>.pushRemote = X
> > >
> > > to
> > >
> > >      branch.<name>.pushRemote = Y
> > >
> > > Signed-off-by: Bert Wesarg <bert.wesarg@googlemail.com>
> > >
> > > ---
> >
> > This commit seems to cause a failure in t5505:
> > https://dev.azure.com/gitgitgadget/git/_build/results?buildId=27833&view=ms.vss-test-web.build-test-results-tab
> >
> > Here is the excerpt of the log:
> >
> > [...]
> >
> > Could you have a look to see whether the code or the test need to be
> > adjusted?
>
> please ensure that you have v4 of this patch. What you see was a bug in v3.

I was talking about the current state of what was merged into `pu`:
https://github.com/gitgitgadget/git/commit/6f032056fd7534b8efd712994c02531d83ada957
(note the red X indicating the build failure).

If you already fixed this, and Junio merely has to pick it up, all the
better.

Thanks,
Dscho

Patch
diff mbox series

diff --git a/builtin/remote.c b/builtin/remote.c
index 9ee44c9f6c..a2379a14bf 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -250,6 +250,7 @@  struct branch_info {
 	char *remote_name;
 	struct string_list merge;
 	enum rebase_type rebase;
+	char *push_remote_name;
 };
 
 static struct string_list branch_list = STRING_LIST_INIT_NODUP;
@@ -267,7 +268,7 @@  static int config_read_branches(const char *key, const char *value, void *cb)
 	char *name;
 	struct string_list_item *item;
 	struct branch_info *info;
-	enum { REMOTE, MERGE, REBASE } type;
+	enum { REMOTE, MERGE, REBASE, PUSH_REMOTE } type;
 	size_t key_len;
 
 	if (!starts_with(key, "branch."))
@@ -280,6 +281,8 @@  static int config_read_branches(const char *key, const char *value, void *cb)
 		type = MERGE;
 	else if (strip_suffix(key, ".rebase", &key_len))
 		type = REBASE;
+	else if (strip_suffix(key, ".pushremote", &key_len))
+		type = PUSH_REMOTE;
 	else
 		return 0;
 	name = xmemdupz(key, key_len);
@@ -315,6 +318,11 @@  static int config_read_branches(const char *key, const char *value, void *cb)
 		 */
 		info->rebase = rebase_parse_value(value);
 		break;
+	case PUSH_REMOTE:
+		if (info->push_remote_name)
+			warning(_("more than one %s"), orig_key);
+		info->push_remote_name = xstrdup(value);
+		break;
 	default:
 		BUG("unexpected type=%d", type);
 	}
@@ -682,6 +690,11 @@  static int mv(int argc, const char **argv)
 			strbuf_addf(&buf, "branch.%s.remote", item->string);
 			git_config_set(buf.buf, rename.new_name);
 		}
+		if (info->push_remote_name && !strcmp(info->push_remote_name, rename.old_name)) {
+			strbuf_reset(&buf);
+			strbuf_addf(&buf, "branch.%s.pushremote", item->string);
+			git_config_set(buf.buf, rename.new_name);
+		}
 	}
 
 	if (!refspec_updated)
@@ -783,6 +796,13 @@  static int rm(int argc, const char **argv)
 					die(_("could not unset '%s'"), buf.buf);
 			}
 		}
+		if (info->push_remote_name && !strcmp(info->push_remote_name, remote->name)) {
+			strbuf_reset(&buf);
+			strbuf_addf(&buf, "branch.%s.pushremote", item->string);
+			result = git_config_set_gently(buf.buf, NULL);
+			if (result && result != CONFIG_NOTHING_SET)
+				die(_("could not unset '%s'"), buf.buf);
+		}
 	}
 
 	/*
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index 883b32efa0..082042b05a 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -737,12 +737,14 @@  test_expect_success 'rename a remote' '
 	git clone one four &&
 	(
 		cd four &&
+		git config branch.master.pushRemote origin &&
 		git remote rename origin upstream &&
 		test -z "$(git for-each-ref refs/remotes/origin)" &&
 		test "$(git symbolic-ref refs/remotes/upstream/HEAD)" = "refs/remotes/upstream/master" &&
 		test "$(git rev-parse upstream/master)" = "$(git rev-parse master)" &&
 		test "$(git config remote.upstream.fetch)" = "+refs/heads/*:refs/remotes/upstream/*" &&
-		test "$(git config branch.master.remote)" = "upstream"
+		test "$(git config branch.master.remote)" = "upstream" &&
+		test "$(git config branch.master.pushRemote)" = "upstream"
 	)
 '
 
@@ -784,6 +786,18 @@  test_expect_success 'rename succeeds with existing remote.<target>.prune' '
 	git -C four.four remote rename origin upstream
 '
 
+test_expect_success 'remove a remote' '
+	git clone one four.five &&
+	(
+		cd four.five &&
+		git config branch.master.pushRemote origin &&
+		git remote remove origin &&
+		test -z "$(git for-each-ref refs/remotes/origin)" &&
+		test_must_fail git config branch.master.remote &&
+		test_must_fail git config branch.master.pushRemote
+	)
+'
+
 cat >remotes_origin <<EOF
 URL: $(pwd)/one
 Push: refs/heads/master:refs/heads/upstream