git为所有分支机构设置了一个远程,无需推送

时间:2018-10-04 23:02:12

标签: git configuration

是否有任何git命令为本地存储库中的分支(完全适用于所有分支)设置一个远程存储库,而无需将提交形式提交给远程本地存储?

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

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

但是我不想推送任何提交。

理想的结果是为git push设置本地和远程存储库之间的链接,因此,如果将来git push不需要指定远程,也可以跳过{{1} }选项。

1 个答案:

答案 0 :(得分:1)

对于一个分支,请参见问题phd linked-to,即Make an existing Git branch track a remote branch?

要对某些分支集执行此操作,请使用循环。要对所有分支执行此操作,请使用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 branch --set-upstream-to代替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/*。如果不是,那么您应该已经知道自己在做什么以及如何修改上述循环。

请注意,将上游设置为不存在的远程跟踪名称将使Git相信该名称曾经存在并且现在消失了:git branch -vv将上游报告为“消失”。 Git对于因果关系不是很聪明,因此认为如果上游设置为不存在的分支,则因果顺序必须是:

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

事实上,实际原因是您出于预期将来会变得合适而故意将上游设置为 。因此,请忽略“已消失”注释。