更改Git远程URL会更新fetch但不会更新push

46

我正在尝试更改Git中我的起始分支的远程URL。我想要更改的仅仅是SSH端口。首先,列出我的远程起源,得到以下结果:

git remote -v


origin  user@example.com:package/name.git (fetch)
origin  user@example.com:package/name.git (push)

然后,我运行set-url命令来更改我的原始URL:

git remote set-url origin ssh://user@example.com:XX/package/name.git    (XX is my port #)

现在,我可以顺利地获取,但是将我的分支推送到远程仓库不起作用,因为推送URL没有更改。再次列出我的远程仓库,我得到了这个结果:

git remote -v


origin  ssh://user@example.com:XX/package/name.git (fetch)
origin  user@example.com:package/name.git (push)

为什么我的set-url命令只更改了获取URL?


1
如果您在命令行上键入“man git-remote”,您可以轻松找到此信息。这适用于几乎所有的git命令,例如“man git-add”,“man git-push”等等。 - Conner
2个回答

76

来自git-remote手册:

set-url
    Changes URL remote points to. Sets first URL remote points to matching regex <oldurl> (first URL if no <oldurl> is given) to <newurl>. If <oldurl> doesn’t match any URL,
    error occurs and nothing is changed.

    With --push, push URLs are manipulated instead of fetch URLs.

因此,您还需要执行以下操作:

git remote set-url --push origin ssh://user@example.com:XX/package/name.git

2
这确实有效,尽管它没有解释为什么它没有像预期的那样更新两个。 - Jack James
3
@JackJames:没错,我很确定这个命令集默认只获取URL。现在我正在尝试在文档中找到确切的描述,但我只发现了几篇不一致的博客文章,例如这篇这篇,它们告诉我们如果没有设置push,则使用fetch作为后备。我可能会查看源代码来找出答案。 - running.t
@running.t 我找不到“pull”远程地址的选项,fetch远程地址和pull一样吗? - Benyamin Jafari
2
@BenyaminJafari:在git-pull文档中,您可以发现pull实际上是fetch后跟着merge。因此,是的,当您调用git pull时,使用的是提取远程地址。 - running.t
有没有一种方法可以用一个命令更改两个URL? - Jim Aho

10
只要涉及的仓库配置文件包含推送URL的条目,set-url默认只会更新获取URL。
[remote "origin"]
    url = fetch.git
    fetch = ...
    pushurl = push.git

正如running.t的回答所解释的那样,您可以使用set-url --push来更改此条目。但是,每次URL更改时,您都必须继续执行此操作。

要恢复set-url的默认行为(同时更改两个URL),只需从配置中删除该条目。或者使用set-url --delete将其删除:

git remote set-url --delete --push origin push.git

至于为什么存储库会在您未添加的情况下包含单独的推送URL:一些Git客户端(如Sourcetree)会“有用地”执行此操作。


1
这个答案对我理解为什么git remote set-url在我实际想要改变的只是fetch URL时却改变了两个URL非常有帮助。 - Gobe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接