GIT:查找包含子模块的文件列表(例如使用GIT ls文件)
我一直在试图找出如何获取git repo中所有文件的列表,包括子模块中包含的文件。目前,GIT:查找包含子模块的文件列表(例如使用GIT ls文件),git,github,Git,Github,我一直在试图找出如何获取git repo中所有文件的列表,包括子模块中包含的文件。目前,git ls files将提供顶级子模块目录,但不提供子模块中包含的文件。在进一步调查中,我发现使用git子模块,您可以递归地找到所有子模块,然后使用以下方法转到git ls文件: git submodule --quiet foreach --recursive "git ls-files" 唯一的问题是,结果是来自子模块的路径,但我需要来自repo的完整路径。因此,对于以下内容 e、 g./some/p
git ls files
将提供顶级子模块目录,但不提供子模块中包含的文件。在进一步调查中,我发现使用git子模块
,您可以递归地找到所有子模块,然后使用以下方法转到git ls文件
:
git submodule --quiet foreach --recursive "git ls-files"
唯一的问题是,结果是来自子模块的路径,但我需要来自repo的完整路径。因此,对于以下内容
e、 g./some/path/to/gitrepo/source/submodule/[file1,file2]
我看到的是:
file1
file2
我想看到的是:
source/submodule/file1
source/submodule/file2
有办法做到这一点吗?从文档中,有一些预定义的变量($name、$path、$sha1和$toplevel),但我不确定如何使用这些变量来获得所需的结果。请查看
git子模块
文档,其中说明:
foreach
计算每个签出子模块中的任意shell命令。
该命令可以访问变量$name
,$path
,$sha1
,以及
$toplevel
:$name
是中相关子模块节的名称
.gitmodules,$path
是相对子模块目录的名称
对于超级项目,$sha1
是
超级项目,$toplevel
是到顶层的绝对路径
超级项目的一部分
根据上述信息,您可以执行以下操作:
git submodule foreach 'git ls-files | sed "s|^|$path/|"'
在本例中,我们只需从子模块中的
git ls文件
中获取输出,并使用sed
预先设置$path
的值,该值是子模块相对于父项目顶层目录的路径。git 2.11+(2016年第4季度)可以采用另一种方法
参见,,(2016年10月7日)作者
(于2016年10月26日合并)
ls文件
:可选地递归到子模块中
“git ls files
“learned”--recurse submodules
”选项,可用于跨子模块获取跟踪文件列表(即,此选项仅适用于“--cached
”选项,不适用于列出未跟踪或忽略的文件)
这将是一个非常有用的工具,可以放置在管道的上游侧,使用xargs读取管道,以处理顶级超级项目中的所有工作树文件
如图所示,输出将包括文件的完整路径,从主父repo开始
目前的方案包括:
--recurse-submodules
递归调用存储库中每个子模块上的ls文件。目前只支持--cached模式
Git 2.13(2017年第2季度)在
ls文件中添加了递归子模块
robustness:
参见(2017年4月13日)作者
(于2017年4月24日被合并)
ls文件
:使用嵌套子模块修复递归子模块
因为提交(“ls文件:可选地递归到
子模块”,2016-10-07,git 2.11)ls文件
已经知道如何递归到
显示文件时的子模块
不幸的是,这在某些情况下失败,包括嵌套更多时
多个子模块,从自身具有
子模块,或者当设置了GIT_DIR
environment变量时
提交前(“设置”
:允许将前缀传递给
git commands”,2017-03-17,git 2.13-rc0)这导致一个错误,表明
--前缀
和--超级前缀
不兼容
相反,在这次提交之后,进程将使用GIT\u DIR
set永远循环
并持续读取父子模块文件并永远递归
通过在设置子进程时为子模块正确准备环境来解决此问题。这与grep等其他命令的行为类似
正如Git2.29(2020年第4季度)所指出的,config
子模块.recurse
无法工作
参见。(于2020年10月5日合并) :使用“--递归子模块”调用“ls文件” 签字人:Philippe Blain ()从未被教导要尊重
子模块.recurse
配置变量,但仍然在“gitsubmodules(7)”中提到该命令,就好像它确实尊重该配置一样
通过使用“--recurse submodules
”选项调用“ls files
”,调整对“gitsubmodules(7)”的调用
gitsubmodules
现在在其中包括:
git ls文件--递归子模块
[注]git ls文件
还需要它自己的--递归子模块
标志
注意:使用git 2.11+(2016年第4季度),您将拥有
git ls文件——递归子模块。看见它可以从主父回购协议运行,并将生成完整路径。如果$path包含“|”(或用于分隔sed的任何其他字符),则从技术上讲,这是错误的。您可以像这样使它更加健壮:git子模块——quiet-foreach的导出路径;bash-c'\''gitls files | sed“s/^/${path/\/\/\/}\/'\/'\\/'\\/'\\\/'\\\\/'\\\/'\\\\/'\\\/'\\\/'\\\/'\\\/'\\\\\/'\\\\/'\。将我指向“git子模块foreach”。我使用[git子模块foreach'git ls files--others--exclude standard']来列出准备添加的文件。
--recurse-submodules