【问题标题】:multiple commands in git alias is not workinggit别名中的多个命令不起作用
【发布时间】:2016-10-19 11:56:33
【问题描述】:

我的.gitconfig 文件中有以下代码:

[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 来拉取远程服务器上的每个分支。但是一直在抛出错误。有人可以帮我理解出了什么问题吗,我尝试过剖析命令,但找不到问题所在。

【问题讨论】:

  • 错误是什么?
  • 您是否尝试过使用单引号(' 而不是")字符作为命令的外部分隔符?或者转义你的双引号(\"而不是"inside字符串。

标签: git terminal


【解决方案1】:

您需要使用反斜杠转义嵌入的双引号。例如:

[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/zorgrefs/remotes/evil/zorg,您不能让本地分支 zorg 跟踪两个远程跟踪分支)。 (出于脚本目的,最好在此处使用git for-each-ref,但现有循环应该足以满足您的目的。)

但是,然后你运行git fetch --all,这意味着从所有远程获取fetch 默认从“当前”远程获取,它被相当松散地定义为“当前分支的远程, 或者 origin 如果当前分支没有远程设置)。一旦获取完成,您运行 git pull --all,它再次将 --all 传递给 git fetch,然后尝试基于合并(或变基)当前分支它配置了remotemerge 设置。

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

要合并或变基每个本地分支,您需要遍历本地分支(同样,最好使用git for-each-ref)。

【讨论】:

  • 谢谢,这就像一个魅力:) 很好的解释!
猜你喜欢
  • 2020-04-21
  • 2017-05-13
  • 2011-02-02
  • 2013-09-22
  • 2021-07-13
  • 1970-01-01
  • 2014-10-05
  • 2015-11-14
相关资源
最近更新 更多