git别名中的多个命令不起作用

时间:2016-10-19 11:56:34

标签: git terminal

我的[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}}来拉动远程服务器上的每个分支。但是不断地犯错误。有人可以帮助我理解出了什么问题吗,我已经尝试过剖析命令,但我无法找到问题所在。

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 fetchremote设置合并(或重新绑定)当前分支。

因此,最多更新您在merge循环中创建的分支的一个

要合并或重新绑定每个本地分支,您需要遍历本地分支(再次,最好使用while)。