我有一个Git存储库,其中有几个子模块。如何在git子模块init运行后列出所有子模块的名称?
git子模块foreach命令可以回显子模块的名称,但这只有在它们被签出后才有效,而在init步骤之后没有发生。在签出之前,链中还有更多的步骤需要执行,我不希望将子模块的名称硬连接到脚本中。
那么是否存在一个Git命令来获取所有当前已注册但尚未签出的子模块的名称?
我有一个Git存储库,其中有几个子模块。如何在git子模块init运行后列出所有子模块的名称?
git子模块foreach命令可以回显子模块的名称,但这只有在它们被签出后才有效,而在init步骤之后没有发生。在签出之前,链中还有更多的步骤需要执行,我不希望将子模块的名称硬连接到脚本中。
那么是否存在一个Git命令来获取所有当前已注册但尚未签出的子模块的名称?
当前回答
Tino的评论显示了一个很好的替代方案:
git config --null --file .gitmodules --get-regexp "\.path\$" | \
sed -nz "s/^[^\\n]*\n//p" | \
xargs --null rm -v;
但是——null/-z选项不适用于BusyBox上的sed或xargs。然后,这是我能想到的最好的替代方案(xargs不会在空格上中断):
grep "^\s*path\s*=" .gitmodules | \
sed -e "s/.*=\s*\"*//" -e "s/\"*\s*\$//" | \
xargs -n 1 -I mark rm -v "mark";
但它有一个缺点,因为xargs调用时不带——null,而我们使用的是-I标记,它正在吞噬前导空白。要修复它,不要使用xargs并将名称写入文件:
grep "^\s*path\s*=" .gitmodules | \
sed -e "s/.*=\s*\"*//" -e "s/\"*\s*\$//" > tempfilefordanmxargsmotherbroked.txt;
while IFS= read -r line; do
echo ".$line."
done <"tempfilefordanmxargsmotherbroked.txt"
rm "tempfilefordanmxargsmotherbroked.txt"
更正:BusyBox上的xargs没有删除前导空白,但完整版本可以。
其他回答
你可以使用与git子模块init使用自身相同的机制,即查看.gitmodules。该文件枚举每个子模块路径及其引用的URL。
例如,从存储库的根目录,cat .gitmodules将把内容打印到屏幕上(假设你有cat)。
因为.gitmodule文件有Git配置格式,你可以使用Git配置来解析这些文件:
git config --file .gitmodules --name-only --get-regexp path
将显示所有子模块条目,并与
git config --file .gitmodules --get-regexp path | awk '{ print $2 }'
您只能得到子模块路径本身。
我用这个:
git config --list|egrep ^submodule
获取路径
grep url .gitmodules | sed 's/.*= //'
在回购中得到名字
grep path .gitmodules | sed 's/.*= //'
这招对我很管用:
git ls-files --stage | grep ^160000
它基于这篇伟大的文章:理解Git子模块
它必须读取grep ^160000。
我用的是这个:
git submodule status | cut -d' ' -f3-4
输出(路径+版本):
tools/deploy_utils (0.2.4)