Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
排除作为已删除的fom`git ls文件暂存的文件`_Git_Cmake_Git Ls Files - Fatal编程技术网

排除作为已删除的fom`git ls文件暂存的文件`

排除作为已删除的fom`git ls文件暂存的文件`,git,cmake,git-ls-files,Git,Cmake,Git Ls Files,我在脚本中使用git ls files来收集git跟踪的所有文件。不幸的是,如果您rm一个文件(而不是git-rm),它在文件系统中不再存在,但仍将由git-ls-files列出 因此,问题是:是否有一种简单有效的方法将不再存在于文件系统中的文件从git ls文件输出本身中排除,或者在输出之后对其进行过滤(例如使用bash)?差不多 git ls-files --existing-only 背景:我想创建一个CMake虚拟目标,它保存属于项目目录(即git跟踪的)的所有文件。我用的是 exec

我在脚本中使用
git ls files
来收集git跟踪的所有文件。不幸的是,如果您
rm
一个文件(而不是
git-rm
),它在文件系统中不再存在,但仍将由
git-ls-files
列出

因此,问题是:是否有一种简单有效的方法将不再存在于文件系统中的文件从
git ls文件
输出本身中排除,或者在输出之后对其进行过滤(例如使用bash)?差不多

git ls-files --existing-only
背景:我想创建一个CMake虚拟目标,它保存属于项目目录(即git跟踪的)的所有文件。我用的是

execute_process(
    COMMAND bash -c "cd ${CMAKE_SOURCE_DIR}; git ls-files"
    OUTPUT_VARIABLE ADDITIONAL_PROJECT_FILES
)
以生成文件列表。但是不幸的是,
rm
ing一个文件,但尚未转移更改将导致错误,因为CMake再也找不到该文件了


更新:在编辑之前,我说的是
git-rm
ing一个文件-它将被
git-ls文件正确处理。但问题依然存在:如果有人删除了一个文件(没有使用git),git ls文件将列出它(我遇到了麻烦)。

我认为你不能用git ls文件本身来做这件事(这是一个小小的遗憾,因为它在其他方面对这类事情非常方便)

最终,对于Git来说,工作树中不存在文件这一事实对于下一次提交并不重要。提交使用索引/暂存区域中的任何内容。
gitls文件
的主要焦点是索引内容,因此可以选择
--stage
--debug
。但是,
--others
选项的存在证明了
gitls文件
可以扫描工作树。扫描工作树后,它可以向您显示哪些文件在工作树中,但在索引中丢失:
--其他
。可以使用
--exclude standard
等从中进一步减去此列表

您的特殊情况是,您不需要获取工作树文件列表并减去索引中的文件,而是希望获取索引文件列表并减去工作树中不的文件。也就是说,如果我们将I定义为索引文件集,将W定义为工作树文件集,我们可以看到
git ls files
可以轻松地计算W\I。我们希望让它计算I\W,即索引中但工作树中缺少的文件集,以便我们可以从
git ls files
的输出中删除它们

唉,没有这样的选择。这就给您留下了
git-diff文件
,它可以轻松地计算这组文件:
git-diff-files--name-only--diff-filter=D HEAD
获取索引中但工作树中缺少的文件。使用此列表可以从
git ls文件
输出中删除文件名,这样您就有了所需的文件名

重要边栏 通常情况下,工作树中缺少但存在于索引中的文件错误地处于这种状态,正确的做法是将它们从索引提取到工作树。此外,无论何时您计划对索引中的文件集执行某些操作,您都应该考虑这样一个事实,即工作树中这些文件的副本可能与索引中的副本不同。例如,Git pre-commit钩子可能用于确保文件的格式对于某些源语言是正确的:例如,通过
clangformat
black
运行这些文件会使它们保持不变

通过检查工作树文件来进行测试从根本上来说是错误的,因为Git不会从工作树构建提交。这意味着这些工具应该将整个索引提取到文件系统中其他位置的临时(新的和空的)工作树中,然后在该临时工作树上运行格式化程序或任何要使用的工具。这个过程的结果告诉您是否应该继续提交。然后,您删除临时工作树(即,自己清理),并提供适当的“可以提交”/“否,不提交”退出状态