排除暂存为已删除的文件git ls-files

时间:2019-06-27 12:23:07

标签: git cmake git-ls-files

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

所以问题:是否有一种简单有效的方法来从{em> git ls-files输出本身中排除文件系统上不再存在的文件还是通过事后过滤(例如使用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归档文件但尚未进行更改将导致错误,因为CMake无法再找到该文件。

更新:在我进行编辑之前,我正在谈论git rm写入文件-git ls-files可以正确处理。但是问题仍然存在:如果有人删除了一个文件(不使用git),git ls-files会列出该文件(我遇到了麻烦)。

2 个答案:

答案 0 :(得分:0)

我不认为您可以git ls-files本身来完成此操作(这是一个很小的耻辱,因为在其他情况下它非常方便)。

对于Git,最终,工作树中不存在文件的事实对于下一次提交并不重要。提交使用索引/暂存区中的任何内容。 git ls-files的主要焦点是索引内容,因此,诸如--stage--debug之类的选项。但是,--others选项的存在证明git ls-files 可以扫描工作树。扫描工作树后,它可以向您显示工作树中哪些文件但在索引--others中丢失。可以使用--exclude-standard之类的方法进一步减去此列表。

您的特殊情况是,不提取工作树文件列表,然后减去索引属于的文件,您想获取一个 index 文件列表,并减去工作树没有的那些文件。也就是说,如果我们将 I 定义为索引文件集,并且将 W 定义为工作树文件集,我们会发现git ls-files可以轻松地计算出 W \ I 。我们希望它计算 I \ W ,这是索引中但工作树中缺少的文件集,因此我们可以从git ls-files的文件中删除它们。输出。

A,没有这样的选择。这样就剩下git diff-files了,它可以轻松计算这组文件:git diff-files --name-only --diff-filter=D HEAD为您提供索引中但工作树中缺少的文件。使用列表从git ls-files输出中删除文件名,您便拥有了所需的内容。

重要的侧边栏

通常,工作树中缺少但存在于索引中的文件由于处于错误状态而处于这种状态,正确的做法是将它们从索引中提取到工作树中。另外,任何时候您打算对索引中的文件集进行某些操作时,都应考虑到以下事实:这些文件在工作树中的副本可能与索引中的副本不同。例如,Git预提交钩子可能旨在确保文件已针对某种源语言正确格式化:例如,通过clang-formatblack运行它们会使它们保持不变。

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

答案 1 :(得分:-1)

git ls-files有很多显示选项……请查看git ls-files --help

在您的情况下,--killed选项似乎是您想要的。