1

如果我运行以下命令:

for r in $(git branch -r | grep -Po "(?<=myremote/).*"); do echo git branch --track $r myremote/$r; done

我得到以下输出:

git branch --track foo myremote/foo
git branch --track bar myremote/bar
git branch --track baz myremote/baz

如果我单独运行这些回显命令,我会得到以下输出:

Branch foo set up to track remote branch foo from myremote.
Branch bar set up to track remote branch bar from myremote.
Branch baz set up to track remote branch baz from myremote.

另一方面,如果我运行以下单行(只需删除“回声”):

for r in $(git branch -r | grep -Po "(?<=myremote/).*"); do git branch --track $r myremote/$r; done

分支创建失败,输出如下:

fatal: 'foo' is not a valid branch name.
fatal: 'bar' is not a valid branch name.
fatal: 'baz' is not a valid branch name.

为什么会发生这种情况,正在运行的命令有什么不同吗?从那以后我该如何调试呢?

更新:

似乎有一些不可见的控制字符流过 unix 管道,即使我指定--color=never了 for grep。如果我将正则表达式更改为(?<=myremote/)[\w]*问题就解决了。但是,我仍然不明白错误的控制字符来自哪里。如果我添加echo $r | od -c到输出以查看来自管道的原始数据,很明显那里有额外的控制字符:

使用原始正则表达式输出:

0000000   f   o   o 033   [   m  \n
0000007

使用新的正则表达式输出:

0000000   f   o   o  \n
0000004

--color=never自从我添加了选项后,额外的字符是什么?它是从哪里来的?

4

1 回答 1

0

这对我来说很好

git branch -r | awk '/myremote/{print $2}' FS=/ | while read q
do
  git branch --track $q myremote/$q
done
于 2013-05-03T03:03:26.587 回答