我正在尝试创建帮助程序来选择所需的git子模块。很简单:
modules=`git submodule | sed 's/.* \(.*\) (.*/\1/'`;
select var in $modules; do
echo $var;
break;
done
我的回购结构如下:
/
|-dir1
| |-submodule1
|-dir2
|-submodule1
当我将上面的脚本保存为可执行文件并从shell运行时,我看到了子模块的正确相对路径,如下所示:
$ cd dir1
$ git-submodule-select
1) submodule1
2) ../dir2/submodule2
#?
但是,如果我尝试在我的.gitconfig中保存与git别名相同的命令,它总是显示相对于repo根的路径,无论我在哪里:
[alias]
subs = "!f() { \
modules=`git submodule | sed 's/.* \\(.*\\) (.*/\\1/'`; \
select var in $modules; do \
echo $var; \
break; \
done; \
}; f"
$ cd dir1
$ git subs
1) dir1/submodule1
2) dir2/submodule2
#?
为什么会这样?我需要相对于我当前位置的路径 - 它可以通过git别名来完成吗?或者我必须只使用全局函数?
答案 0 :(得分:0)
git别名的文档包含了你需要的内容。
别名。*
git命令包装器的命令别名 - 例如在定义“alias.last = cat-file commit HEAD”之后,调用“git last”等同于“git cat-file commit HEAD”。为避免使用脚本时出现混淆和麻烦,将忽略隐藏现有Git命令的别名。参数由空格分隔,支持通常的shell引用和转义。引号对或反斜杠可用于引用它们。
如果别名扩展以感叹号作为前缀,则将其视为shell命令。例如,定义“alias.new =!gitk --all --not ORIG_HEAD”,调用“git new”等同于运行shell命令“gitk --all --not ORIG_HEAD”。请注意,shell命令将从存储库的顶级目录执行,该目录可能不一定是当前目录。通过从原始当前目录运行git rev-parse --show-prefix来设置GIT_PREFIX。见git-rev-parse。
特别是关于shell命令执行位置的最后一位和GIT_PREFIX
变量。