我的[alias]
john = "!f(){ git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done; git fetch --all; git pull --all; };f"
文件中包含以下代码:
alias
基本上创建一个{{1}}来拉动远程服务器上的每个分支。但是不断地犯错误。有人可以帮助我理解出了什么问题吗,我已经尝试过剖析命令,但我无法找到问题所在。
答案 0 :(得分:0)
您需要使用反斜杠转义嵌入式双引号。例如:
[alias]
next = "!f() { id=$(git rev-list --reverse --ancestry-path ..master | head -1); test -n \"$id\" && git checkout $id || echo 'no more commits'; }; f"
(我实际上已经注释掉了,因为硬编码master
是伪造的:这是来自this answer的遗留物。)
你也可以使用反斜杠换行包装长行:
next = "!f() { \
id=$(git rev-list --reverse --ancestry-path ..master | head -1); \
test -n \"$id\" && git checkout $id || echo 'no more commits'; }; f"
(未经测试,但应该有效)。
所有这一切都说错了:
这基本上是为拉动远程服务器上的每个分支创建一个别名。
您的示例别名尝试为每个远程跟踪分支创建一个新的本地分支(尽管它很好,但完全无法完全通用,例如,如果您同时拥有refs/remotes/origin/zorg
和{{ 1}},您不能让本地分支refs/remotes/evil/zorg
跟踪两个远程跟踪分支。 (出于脚本目的,最好在这里使用zorg
,但现有的循环应该可以很好地用于您的目的。)
但是,然后你运行git for-each-ref
,这意味着从所有遥控器中获取(git fetch --all
默认从“当前”遥控器中取出,这个定义非常宽松地定义为“当前分支的远程,或fetch
,如果当前分支没有远程设置)。一旦提取完成,你运行origin
,再次将git pull --all
传递给--all
,然后尝试根据配置的git fetch
和remote
设置合并(或重新绑定)当前分支。
因此,最多更新您在merge
循环中创建的分支的一个。
要合并或重新绑定每个本地分支,您需要遍历本地分支(再次,最好使用while
)。