【发布时间】:2011-02-24 09:38:37
【问题描述】:
有没有办法建立一个 git 存储库,以便 git pull 默认为一个远程,git push 默认为另一个?我知道我可以通过更改.git/config 分支部分中remote 变量的值来设置both,但是如何分别为每个方向设置?
【问题讨论】:
有没有办法建立一个 git 存储库,以便 git pull 默认为一个远程,git push 默认为另一个?我知道我可以通过更改.git/config 分支部分中remote 变量的值来设置both,但是如何分别为每个方向设置?
【问题讨论】:
根据我从git config man page 收集到的信息,上游回购是:
branch.remote设置
git pull/fetch 和git pull
对于一个给定的分支,我看不出有任何方法可以有两个独立的远程默认情况下。
【讨论】:
git config remote... 和 git remote set-url...` 答案之后,对于单个分支或整个回购副本。
origin,并推/拉到/从匹配的分支名称:git push --set-upstream origin <current_branch_name>
对于 Git 1.6.4 及更高版本,使用 git config 设置 remote.<name>.pushurl。
人们可能会使用它来使用只读的https: 协议进行拉取,并使用基于 ssh 的协议进行推送。
说origin 的网址(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
【讨论】:
从 Git 版本 1.7.0 开始,您可以通过以下方式进行设置:
git remote set-url --push origin https://your.push.com/blah/
【讨论】:
user392887's answer 大部分是正确的,但是:
您应该更喜欢使用 SSH。据 GitHub 称,“我们强烈建议在与 GitHub 交互时使用 SSH 连接。SSH 密钥是一种无需密码即可识别受信任计算机的方法。”
任何使用 RHEL/CentOS 6 的人都将默认使用 git 1.7.1,它支持 set-url。
所以,git 1.7.1 的首选解决方案。后来是:
git remote set-url --push origin git@github.com:username/somerepo.git
【讨论】:
从 Git 1.8.3 开始,您可以使用 remote.pushDefault 选项来做您想做的事(即为 pull 和 push 设置不同的默认遥控器)。您可以像设置任何其他选项一样设置该选项;例如,要将其设置为pushTarget 遥控器,请使用
git config remote.pushDefault pushTarget
此选项将产生以下效果:
git pull 将从.git/config 中相关分支部分中remote 选项指定的远程拉取,而git push 将推送到remote.pushDefault 指定的远程。请注意,您需要指定远程的名称,而不是 URL。这使得该解决方案比涉及remote.<name>.pushurl 的解决方案更灵活,因为(例如)您仍然有两个遥控器的跟踪分支。您是否需要或想要这种灵活性取决于您。
The release notes 说这个选项是专门为支持三角工作流而添加的。
【讨论】:
upstream pull 的遥控器,因为......好吧......在那些 pull 期间它位于我的存储库的上游。但选项是pushDefault,而不是pullDefault,所以我在示例中使用downstream 作为名称。将其称为defaultPushTarget 可能是一个更好的主意;)
如果你也来这里寻找每个分支的解决方案,这里是来自手册:
branch.<name>.pushRemote在 branch 上时,它会覆盖 branch..remote 以进行推送。它还覆盖 remote.pushDefault 以从分支推送。当您从一个地方(例如您的上游)拉取并推送到另一个地方(例如您自己的发布存储库)时,您需要设置 remote.pushDefault 来指定要推送到所有分支的远程,并使用此选项来覆盖它对于特定的分支。
【讨论】:
git config branch.my_branch.pushRemote my_push_remote
感谢MvanGeest 链接到the git 1.8.3 release notes。这些发行说明说:
remote.pushdefault 更好地支持(覆盖
“起源”事物)和branch.*.pushremote(覆盖
branch.*.remote) 配置变量。我一直使用这种三角工作流来进行开源贡献。例如:我有自己的llvm/llvm-project 的 GitHub 分支,我想让自己的 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
根据上面引用的发行说明,我刚刚将本地 repo 的 .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
现在我可以做一个简单的git checkout main ; git pull 来从上游/main 中提取,以及一个简单的git checkout main ; git push 来推送到 origin/main。这就是我想要的“三角工作流程”。
【讨论】: