【问题标题】:How can I get a literal single quote in a git alias (that's a bash function)?如何在 git 别名中获得文字单引号(这是一个 bash 函数)?
【发布时间】:2015-10-01 19:29:52
【问题描述】:

我正在开发一个包含许多不同 git 存储库的代码库。因此,我正在使用子模块来尝试将它们全部组织到一个源代码库中。它看起来像这样:

source
  |- ember
  |- rails

我现在正在尝试创建一个 git 别名来检查所有 repos 中的相同分支名称。如果我手动执行此操作,命令行上的命令如下所示:

git checkout -b <branch-name>; git submodule foreach 'git checkout -b <branch-name>'

我希望能够只输入:

git sco -b <branch-name>

并让sco 扩展为完整的命令。到目前为止,我想出了这个:

<.gitconfig>
...
[alias]
  sco = "!f() {\
    if [ $# -eq 0 ];then\
      branch=$(git rev-parse --abbrev-ref HEAD);\
      git submodule foreach 'git checkout '"$branch"'';\
    else\
      git checkout $@;\
      git submodule foreach 'git checkout '"$@"'';\
    fi\
    }; f"

请注意,如果没有传递给sco 的参数,它将检查所有子模块中的当前分支。该案例按预期工作。这是参数不起作用的情况。我认为(tm)原因是单引号被吞了。

任何帮助将不胜感激。

【问题讨论】:

  • 您的 $branch 和 $@ 变量不会在单引号字符串中展开。您也未能在 git checkout 命令中引用`$@`。该别名的哪一部分工作不正常?
  • @EtanReisner 对。看起来这是一个稍微过时的版本。我将编辑示例。但是,我不明白为什么 $branch 和 $@ 在单引号字符串中。整个别名是一个双引号字符串,我希望单引号是该字符串中的文字单引号。
  • 外部双引号用于 git-config 引用。外壳看不到它们。它只看到外部引号的内容。如果 shell 确实看到了外引号,那么整个内容将只是一个字符串,并且在 shell 运行时以错误结尾。
  • git submodule foreach 要求执行关联的命令作为单个参数提供,对吗?但是当 shell 扩展 "$@" 时,每个函数参数都扩展为一个单独的单词。如果有多个,那么您的命令将被分解。您可以通过更改为 "$*" 来解决此问题。

标签: git bash


【解决方案1】:

感谢@EtanReisner,我想通了。关键的见解是别名中的单引号被 bash 解释为单引号字符串。这是最终的别名:

  sco = "!f() {\
    if [ $# -eq 0 ];then\
      branch=$(git rev-parse --abbrev-ref HEAD);\
      git submodule foreach '"'"git checkout "$branch'"';\
    else\
      git checkout "$@";\
      git submodule foreach '"'"git checkout "$@'"';\
    fi\
    }; f"

像魅力一样工作。

【讨论】:

  • 你需要有 \"$@\" 才能让 git 的解析吃掉你的 " 字符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2021-02-13
  • 2013-12-05
  • 1970-01-01
  • 2022-12-23
  • 2021-08-29
相关资源
最近更新 更多