git 为所有分支设置远程而不推送

Jim*_*mix 5 git configuration

是否有任何 git 命令可以为本地存储库中的分支(完美适用于所有分支)设置远程存储库,而无需将本地提交推送到远程?

简而言之,我想要得到的所有东西都可以通过使用 flag 来完成--all git push --all

也可以选择设置上游-u git push --all -u

但我不想推动任何提交。

期望的结果只是设置本地和远程存储库之间的链接,git push因此如果您git push将来不需要指定远程,也可以跳过--all选项。

tor*_*rek 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
Run Code Online (Sandbox Code Playgroud)

(实际上,这只是一行,只是在这里分成了更易读的行)。

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

如果origin/xyzzy还不存在,则不能将分支设置xyzzy为其origin/xyzzy上游。这是完全符合逻辑的。然而,这可能不是你想要的。

您可以通过低于 的级别,用原始操作git branch替换 来覆盖 Git 对此的智能:git branch --set-upstream-togit config

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
Run Code Online (Sandbox Code Playgroud)

这假设您的remote.origin.fetch设置是+refs/heads/*:refs/remotes/origin/*. 如果不是,您应该已经知道您在做什么以及如何修改上面的循环。

请注意,将上游设置为不存在的远程跟踪名称将使 Git 相信该名称曾经存在但现在已消失:git branch -vv将报告上游为“消失”。Git 对于因果关系不是很聪明,所以它认为如果上游被设置为一个不存在的分支,那么因果顺序一定是:

  1. 上游存在
  2. 分支的上游设置为现有上游
  3. 删除upstream,导致分支的upstream设置不当

事实上,真正的原因是您故意不恰当设置上游,并预期该设置将来会变得合适。所以忽略“gone”注释。