对于一个分支,请参见问题
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”注释。