跟踪远程所有本地分支

时间:2015-11-16 15:58:40

标签: git github version-control

我在回来的时候用当地的回购做了一些可疑的事情,这导致我所有的当地分支机构都失去了他们的远程跟踪。我认为我已经正确设置了远程设备,因为我可以看到所有远程分支并且还可以添加跟踪。

当我在本地创建新分支时,它工作正常。

这是git branch -llv

的输出

$ git branch -lvv Branch 1 d6c67c8 [origin/Branch 1] Commit message Branch 2 17503c9 Commit message Branch 3 4f987c4 Commit message Branch 4 6e5670a [origin/Branch 4] Commit message Branch 5 77bd14c Commit message

我的问题是,我可以使用一个命令在我的所有本地branch_x和远程等效origin/branch_x之间添加跟踪吗?因为我有很多分支,所以它似乎相当繁琐的一个接一个地做。在许多情况下,遥控器很可能领先于我当地的分支机构,但可能不是大多数情况。

我正在考虑做git push -u origin --all这样的事情,但我不确定这是否是最佳方法。

2 个答案:

答案 0 :(得分:1)

我唯一可以建议的是:

git branch --set-upstream-to origin/your_branch

将其设置为一个分支。

现在,你必须编写一个bash脚本,每个分支都会这样做:

git checkout $your_branch
git branch --set-upstream-to origin/$your_branch

另一件事:

branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
     echo $branch
done

将为您打印所有分支的名称,以/ refs / heads为前缀 您可以在脚本中使用它。

实际上你的问题应该通过运行来解决:

branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
     branch_name=`echo $branch | "sed s|refs/heads/||"`
     git checkout $branch_name
     git branch --set-upstream-to origin/$branch_name
done

答案 1 :(得分:0)

这是已接受答案的另一种形式,让git去除路径并删除bash数组。另外,不要尝试跟踪master分支(通常是隐式的)或HEAD。用less替换最后一行以预览命令。

git for-each-ref --shell --format='[[ %(refname) =~ /master$ ]] \
  || [[ %(refname) =~ /HEAD$ ]] \
  || git branch --track %(refname:lstrip=3) %(refname)' refs/remotes/origin |
    while read line; do eval "${line}"; done