【发布时间】: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 扩展"$@"时,每个函数参数都扩展为一个单独的单词。如果有多个,那么您的命令将被分解。您可以通过更改为"$*"来解决此问题。