我正在尝试创建助手来选择所需的 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 别名完成吗?或者我必须只使用全局函数?
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_PREFIX设置为通过从原始当前目录运行 git rev-parse --show-prefix 返回。请参阅 git-rev-parse。
具体来说,最后一点是关于 shell 命令将从何处执行以及GIT_PREFIX
变量。