【问题标题】:Different default remote (tracking branch) for git pull and git pushgit pull 和 git push 的不同默认远程(跟踪分支)
【发布时间】:2011-02-24 09:38:37
【问题描述】:

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

【问题讨论】:

    标签: git branch


    【解决方案1】:

    根据我从git config man page 收集到的信息,上游回购是:

    • 默认来源
    • 由branch.remote设置
    • 总是同时用于git pull/fetch 和git pull

    对于一个给定的分支,我看不出有任何方法可以有两个独立的远程默认情况下。

    【讨论】:

    • 这在 git v1.8.3.2 的实践中似乎是正确的,在尝试了 git config remote... 和 git remote set-url...` 答案之后,对于单个分支或整个回购副本。
    • 将当前分支的默认远程重置为origin,并推/拉到/从匹配的分支名称:git push --set-upstream origin <current_branch_name>
    【解决方案2】:

    对于 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 存储库中推送到一个说“开发”分支并从说“生产”分支拉出?
    【解决方案3】:

    从 Git 版本 1.7.0 开始,您可以通过以下方式进行设置:

    git remote set-url --push origin https://your.push.com/blah/
    

    【讨论】:

    • 比问题晚了 3 年,但这应该是新接受的答案!
    • @Kevlar 为什么?接受用于标记并不总是“最佳”答案,而是为 OP 制定的答案(阅读常见问题解答以获取更多信息)。在提出上述问题时,答案不起作用(甚至不存在),因为 git 早于 1.8。然而,接受的答案确实适用于 OP。您认为三年后改变 OP 决定的原因是什么?
    • @trejder Stack Overflow 也是一个为未来访问者提供有用答案的地方,他们通过搜索引擎或其他方式找到问题。首先出现当前最佳答案是很有价值的。我并不是说 OP 必须 改变接受的答案,但这样做是完全合理的(并且在我看来是一个净正面)。
    • @trejder 这也没有回答所提出的问题。
    • 1. fetch 在这里是相关的,pull 只是 fetch+merge 2。显然你必须反过来做
    【解决方案4】:

    user392887's answer 大部分是正确的,但是:

    1. 您应该更喜欢使用 SSH。据 GitHub 称,“我们强烈建议在与 GitHub 交互时使用 SSH 连接。SSH 密钥是一种无需密码即可识别受信任计算机的方法。”

    2. 任何使用 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
    

    【讨论】:

    • 如何在 libgit2 中使用 SSH?
    【解决方案5】:

    从 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 说这个选项是专门为支持三角工作流而添加的。

    【讨论】:

    • 奇怪:我以为你只推到上游,你不知道有多少下游回购从你那里拉出来:见stackoverflow.com/a/2749166/6309
    • @VonC 啊,是的,我明白为什么会令人困惑了。我通常会默认调用我想从upstream pull 的遥控器,因为......好吧......在那些 pull 期间它位于我的存储库的上游。但选项是pushDefault,而不是pullDefault,所以我在示例中使用downstream 作为名称。将其称为defaultPushTarget 可能是一个更好的主意;)
    • @MvanGeest 我同意。但我确认您通常会推向“上游”。有一个(或很少且已知的)上游。但是可能有许多(和未知的)下游。这就是 DVCS(如“分布式”)宇宙。
    【解决方案6】:

    如果你也来这里寻找每个分支的解决方案,这里是来自手册:

    branch.<name>.pushRemote

    在 branch 上时,它会覆盖 branch..remote 以进行推送。它还覆盖 remote.pushDefault 以从分支推送。当您从一个地方(例如您的上游)拉取并推送到另一个地方(例如您自己的发布存储库)时,您需要设置 remote.pushDefault 来指定要推送到所有分支的远程,并使用此选项来覆盖它对于特定的分支。

    【讨论】:

    • 所以在命令行中是git config branch.my_branch.pushRemote my_push_remote
    【解决方案7】:

    感谢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。这就是我想要的“三角工作流程”。

    【讨论】:

      猜你喜欢
      • 2019-09-30
      • 2011-02-05
      • 1970-01-01
      • 2011-03-04
      • 2016-03-15
      • 2012-01-16
      • 2018-02-12
      • 1970-01-01
      • 2014-08-22
      相关资源
      最近更新 更多