我正在尝试以递归方式列出所有子模块中的所有未跟踪文件:
git submodule foreach --recursive git ls-files --others --exclude-standard --full-name
但这没有列出绝对路径,它给出了子模块文件夹的相对路径。
我应该如何修改我的命令?
我正在尝试以递归方式列出所有子模块中的所有未跟踪文件:
git submodule foreach --recursive git ls-files --others --exclude-standard --full-name
但这没有列出绝对路径,它给出了子模块文件夹的相对路径。
我应该如何修改我的命令?
(注意:这是一个“工具”答案,而不是“解决方案”答案。也就是说,这个答案旨在为您提供构建所需解决方案所需的工具。)
用于git rev-parse --show-toplevel
获取当前存储库的绝对路径。当然,在超级项目中执行此操作。这为您提供了任何路径前缀的第一部分——但现在您需要剩余部分。
正如文档所述git submodule
,在 a 中foreach
,您可以访问多个变量,包括$path
:
$path
是相对于超级项目的子模块目录的名称...
尚不清楚(您必须自己测试)是$path
在递归子模块的情况下是否是累积的。也就是说,如果超级项目 A 在 path 下有子模块 B top/subB
,$path
那么top/subB
当你在子模块 B 中时。但是假设子模块 B 作为子模块 C 的超级项目,B 自己的路径是contained/C
。将在子模块 C 内部时出现,还是仅出现在子模块 C$path
中?1top/subB/contained/C
contained/C
在任何情况下,一旦你有了适当的前缀,只需使用类似的东西sed
把它贴在前面,例如:
git ls-files --others --exclude-standard --full-name | sed "s,^,$prefix,"
where$prefix
设置为适当的前缀,可能只是$path/
. (这假设您的文件名都不包含嵌入的换行符;如果包含,则您的原始命令无论如何都有问题。正如所写,它还假设您的前缀都不包含逗号 - 如果包含,请使用除,
, 或用$prefix
反斜杠引用逗号。)
1逻辑表明这将是完整的路径;如果不知道有多少子模块已被递归,则相对路径并不完全可用。但是,相对路径更容易产生。
感谢托雷克的想法。这有效:
git submodule foreach --quiet 'a=$(printf "$(git ls-files --others --exclude-standard --full-name|sed "s~^~$(pwd)/~")"; printf x); a=${a%x}; echo "$a"' | sed '/^\s*$/d'