15

这很奇怪。我正在尝试制作一个脚本来检查每个本地分支并将原点/主分支重新定位到它上面。

所以这是我的脚本:

for br in `git branch -l`; do
    git checkout $br
    git rebase origin/master
done

简单的。但在我编写脚本之前,我想确保 `git branch -l` 返回我认为它正在返回的内容......它不是。

git branch -l返回正确的结果。但是`git branch -l`实际上是返回所有本地分支加上当前目录中的文件!

它像这样返回它:

[list of local branches minus master] [list of files in the current dir] master

`git branch --list` 的行为方式相同。

为什么会这样?

有没有更好的方法将 origin/master 重新定位到所有本地分支?

4

2 回答 2

21

这是一件很愚蠢的事情。

git branch --list 在当前选择的分支前面加上一个星号;您的 shell 脚本将其解释为通配符,并将当前目录中的文件添加到项目列表中,以便用您的 for 循环遍历。

你可以试试

for br in `git branch -l | tr '*' ' '`; do
    git checkout $br
    git rebase origin/master
done
于 2013-07-03T15:26:11.083 回答
3

您可以做的另一件事,在这里并不真正需要,但对更健壮的脚本很有用,是用来git for-each-ref提取您想要的引用名。例如,git branch --list减去前缀空格或星号的等价物是:

$ git for-each-ref refs/heads/ --format='%(refname:short)'

如本例所示:

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git for-each-ref refs/heads/ --format='%(refname:short)'
master

git branch -r同样,您可以使用refs/remotes/代替来获取遥控器( ) refs/heads/,并且您可以使用查找标签refs/tags/。甚至还有一些额外的选项for-each-ref旨在保护字符串免受各种程序操作的影响(对于这种特殊情况不需要,请参阅文档git check-ref-format及其对分支名称的限制),但可以evalgit for-each-ref.

于 2013-07-03T23:14:52.167 回答