Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GIT:查找包含子模块的文件列表(例如使用GIT ls文件)_Git_Github - Fatal编程技术网

GIT:查找包含子模块的文件列表(例如使用GIT ls文件)

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 repo中所有文件的列表,包括子模块中包含的文件。目前,
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