git pull和git push的默认远程(跟踪分支)不同

svi*_*ick 59 git branch

有没有办法设置一个git存储库,所以git pull默认为一个远程,git push默认为另一个?我知道我可以通过改变分支部分中变量的值来设置两者,但是如何分别对每个方向进行设置?remote.git/config

use*_*887 89

从Git 1.7.0开始,您可以使用以下命令设置:

git remote set-url --push origin https://your.push.com/blah/
Run Code Online (Sandbox Code Playgroud)

  • @trejder Stack Overflow也是一个为未来访问者提供有用答案的地方,他们可以通过搜索引擎或其他任何方式找到问题.将当前最佳答案首先出现是很有价值的.我并不是说OP*必须*改变已接受的答案,但这样做是完全合理的(而且在我看来是净积极的). (9认同)
  • @trejder这也没有回答被问到的问题. (2认同)

Chr*_*sen 26

对于Git 1.6.4及更高版本,请remote.<name>.pushurl使用git config进行设置.

有人可能会使用它来使用只读https:协议并使用基于ssh的协议进行推送.


origin的是url(remote.origin.url)https://git.example.com/some/repo.git.它是只读的,但您可以通过基于ssh的"URL"进行写访问git@git.example.com:some/repo.git.执行以下命令,实现推送基于ssh的协议:

git config remote.origin.pushurl git@git.example.com:some/repo.git
Run Code Online (Sandbox Code Playgroud)

  • 如何在同一个远程+裸机Git存储库中推送到说“开发”分支和拉说“生产”分支? (3认同)

Mva*_*est 22

由于Git的1.8.3,您可以使用remote.pushDefault选项做你想要什么(即具有不同的默认遥控器的pullpush).您可以像任何其他选项一样设置选项; 例如,要将其设置为pushTarget遥控器,请使用

git config remote.pushDefault pushTarget
Run Code Online (Sandbox Code Playgroud)

此选项将具有以下效果:

  • git pull将从remote相关分支部分中的选项指定的远程拉出.git/config,同时
  • git push将推送到指定的遥控器remote.pushDefault.

请注意,您需要指定远程的名称,而不是URL.这使得此解决方案比涉及的解决方案更灵活remote.<name>.pushurl,因为(例如)您仍将拥有两个遥控器的跟踪分支.您是否需要或希望获得这种灵活性取决于您.

发布说明称此选项专门用于支持三角工作流程.


Quu*_*one 7

感谢MvanGeest链接到git 1.8.3 发行说明。这些发行说明说:

  • remote.pushdefault新的(覆盖“起源”事物)和branch.*.pushremote(覆盖 )配置变量更好地支持三角形“从一个地方拉出,推送到另一个地方”工作流程branch.*.remote

我一直使用这样的三角工作流程来进行开源贡献。例如:我有自己的 GitHub 分支llvm/llvm-project,并且我想让自己的main分支与上游的main. 所以我经常git pull upstream main; 如果我可以直接打字就方便了git pull但是,我不希望有任何机会在我打算git push<return>这样做之前git push origin main<return>意外地送到上游项目的存储库!所以,在今天之前,我的.git/config样子是这样的:

[remote "origin"]
        url = git@github.com:Quuxplusone/llvm-project
        fetch = +refs/heads/*:refs/remotes/origin/*
[remote "upstream"]
        url = git@github.com:llvm/llvm-project
        fetch = +refs/heads/*:refs/remotes/upstream/*
[branch "main"]
        merge = refs/heads/main
        remote = origin
Run Code Online (Sandbox Code Playgroud)

根据上面引用的发行说明,我刚刚将本地存储库更改.git/config为:

[remote "origin"]
        url = git@github.com:Quuxplusone/llvm-project
        fetch = +refs/heads/*:refs/remotes/origin/*
[remote "upstream"]
        url = git@github.com:llvm/llvm-project
        fetch = +refs/heads/*:refs/remotes/upstream/*
[branch "main"]
        merge = refs/heads/main
        remote = upstream
        pushremote = origin
Run Code Online (Sandbox Code Playgroud)

现在我可以做一个简单的git checkout main ; git pull从上游/主拉,和一个简单的git checkout main ; git push推送到原点/主。这就是我想要的“三角工作流程”。


Von*_*onC 5

从我可以从git config man page收集到的,上游 repo 是:

  • 默认原点
  • 通过设置 branch.remote
  • 总是为git pull/fetchgit pull

对于给定的分支,我看不到默认情况下有两个单独的远程任何方法。