如何获取带有子模块的 Git 存储库中所有文件的绝对路径?



我正在尝试递归列出所有子模块中所有未跟踪的文件:

git submodule foreach --recursive git ls-files --others --exclude-standard --full-name

但这并没有列出绝对路径,它给出了子模块文件夹的相对路径。

我应该如何修改我的命令?

(注意:这是一个"工具"答案,而不是"解决方案"答案。 也就是说,此答案旨在为您提供构建所需解决方案所需的工具。

使用git rev-parse --show-toplevel获取当前存储库的绝对路径。 当然,在超级项目中这样做。 这为您提供了任何路径前缀的第一部分,但现在您将需要剩余部分。

正如git submodule文档所说,在foreach中,您可以访问多个变量,包括$path

$path是子模块目录相对于超级项目的名称...

目前还不清楚的是(你必须自己测试(在递归子模块的情况下$path是否是累积的。 也就是说,如果超级项目 A 在路径top/subB下有子模块 B,则当您在子模块 B 中时,$pathtop/subB。 但是假设子模块 B 充当子模块 C 的超级项目,B 自己的路径contained/C。 在子模块 C 中时会top/subB/contained/C$path,还是只会contained/C1

无论如何,一旦你有了合适的前缀,只需使用类似sed的东西把它贴在前面,例如:

git ls-files --others --exclude-standard --full-name | sed "s,^,$prefix,"

其中$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'

相关内容

  • 没有找到相关文章

最新更新