为所有分支设置远程Git仓库但不进行推送

5
有没有一种git命令可以在本地存储库中为一个分支(最好是全部)设置远程存储库,而不需要将本地提交推送到远程存储库?
简而言之,可以通过使用标志--all来完成所有想要的操作: git push --all 也可以选择设置上游-u git push --all -u 但我不想推送任何提交。
期望的结果只是为git push设置本地和远程存储库之间的链接,因此如果您在将来进行git push,则无需指定远程存储库,也可以跳过--all选项。

1
可能是让现有的Git分支跟踪远程分支?的重复问题。 - phd
https://stackoverflow.com/search?q=%5Bgit%5D+set+remote - phd
1个回答

5
对于一个分支,请参见问题phd linked-to,即如何使现有的Git分支跟踪远程分支? 要对一些分支执行此操作,请使用循环。要对所有分支执行此操作,请使用git for-each-ref循环遍历所有分支,就像在这个sh / bash循环结构中一样:
git for-each-ref --format='%(refname:short)' |
    while read name; do
        git branch --set-upstream-to=origin/$name $name
    done

(这实际上是一行,只是在此处分成更易读的几行)。

假设您希望每个 name 的上游名称为 origin/name。如果不是,请适当替换。请注意,这将覆盖每个此类名称的现有上游设置,或者如果尚未存在具有该名称的上游,则失败。

如果 origin/xyzzy 尚不存在,则无法将分支 xyzzy 设置为其上游为 origin/xyzzy。这是完全合理的。但是,这可能不是您想要的。

您可以通过进入 git branch 的下一级,使用原始的 git config 操作来覆盖 Git 对此的智能处理:

git for-each-ref --format='%(refname:short)' |
    while read name; do
        git config branch.$name.remote origin
        git config branch.$name.merge refs/heads/$name
    done

这里假设你的remote.origin.fetch设置为+refs/heads/*:refs/remotes/origin/*。如果不是这样,你应该已经知道自己在做什么,以及如何修改上面的循环。
请注意,将upstream设置为不存在的远程跟踪名称会使Git认为该名称曾经存在,现在已经消失:git branch -vv将报告upstream为“gone”。Git在因果关系方面并不聪明,因此它认为如果将upstream设置为不存在的分支,则因果序列必须是:
1. upstream存在 2. 分支的upstream设置为现有的upstream 3. 删除upstream,导致分支的upstream被不适当地设置
而实际原因是你故意不当地设置了upstream,预期在未来设置变得合适。所以忽略“gone”注释。

如果 origin/xyzzy 不存在,您就不能将分支 xyzzy 设置为其上游的 origin/xyzzy。这对我来说似乎不合逻辑。我期望这个命令实际上会创建 origin/xyzzy。或者您是在暗示需要提前创建 origin/xyzzy?在这种情况下需要使用哪个命令? - user7860670
@user7860670:git branch --set-upstream-to 不会创建上游名称。它必须存在。所以是的,我暗示需要提前创建 origin/xyzzy(在设置上游到步骤之前)。问题在于创建它的命令是 git push,或者更具体地说,Git 操作看到 xyzzy 已经在 origin 上创建,因此在本地创建 origin/xyzzy。但是这个操作通常是你自己的 git push - torek
这就像是说在你请求加入俱乐部之前,你必须加入俱乐部成为会员:你想要设置上游使得 git push 命令不需要选项即可生效,但是为了达到这个目的,你必须先让 git push 命令(无选项)正常工作,然后才能使其不需要选项即可正常运行。 - torek
任何需要使用 git push 的解决方案都不适用于这个问题的背景。 - user7860670
@user7860670:确实,这就是问题所在:存在一个进退两难的局面。你必须先运行 git push 来创建上游,以便你可以设置上游,以便你可以运行 git push简单的解决方案是运行一次 git push -u origin HEAD,这将使你摆脱进退两难的局面,之后你就不再处于其中了。但是 OP 要求用一种方法来设置 N 个现有分支的上游(显然已经存在上游),所以这就是我的回答。 - torek
显示剩余2条评论

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