我正在开发一个代码库,它有许多不同的git repos。因此,我正在使用子模块尝试将所有这些子模块组织成一个源代码库。它看起来像这样:
source
|- ember
|- rails
我现在正试图制作一个git别名来检查所有存储库中的相同分支名称。如果我手动执行此操作,命令在命令行中显示如下:
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)原因是单引号被吞噬了。
非常感谢任何帮助。
答案 0 :(得分:0)
感谢@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"
像魅力一样。