首页 > 解决方案 > 查找源代码控制下包含在 .gitignore 中的所有文件

问题描述

您好,我有一个带有现有 .gitignore 文件的 git 存储库。由于 .gitignore 文件中的某些路径和/或文件受源代码控制,因此似乎有些问题。

为了清理它,我正在寻找一种方法来列出所有受源代码控制的文件,这些文件应该被忽略,因为它们包含在 .gitignore 文件中。

没有通用的方法来说明是否需要忽略或包含文件,因此我需要此列表来手动查看每个文件。

有谁知道如何做到这一点?

示例:这非常简化,我们在这里讨论 1000 个文件。源代码管理下的文件夹中有 4 个文件

  1. .gitignore
  2. 测试.cpp
  3. 测试日志
  4. 测试结果

.gitignore 的内容

.gitignore
test.*

test.cpp 已经在源代码控制下,因此可以跟踪更改。这是应该的。但是 test.cpp 显然包含在 .gitignore 文件中。因此我喜欢修改 gitignore 文件,使其包含

.gitignore
test.*
!test.cpp

所以我想要的是一个列表,显示 test.cpp 在源代码控制下,而 gitignore 正在排除它,以便我可以修改 gitignore 文件以准确反映当前状态。

本例中列表的结果应该是。

  1. .gitignore
  2. 测试.cpp

在我更复杂的场景中,这也应该适用于子文件夹中的文件。

标签: gitgitignore

解决方案


我设法为自己找到了解决方案(我认为)。

看起来这个命令完全符合我的意图。

comm -12 <(git ls-files) <(find .  | cut -sd / -f 2- | sort | xargs git check-ignore --no-index)

comm -12 <(input list 1) <(input list 2):一个非常有用的命令,我记得那个命令,排除仅存在于一个输入列表中的文件,因此只有两个列表中都存在的文件是 listet

git ls-files:显示 git 控制下的所有文件

find .: 显示当前文件夹和子文件夹中的所有文件

cut -sd / -f 2-: 因为 find 打印 ./ 在每个文件路径前面,我们需要摆脱它,因为 git ls-files 没有。基本上我们告诉 cut / 是一个分隔符。cut 会将文件路径拆分为多个部分。“-f 2-” 告诉 cut 从第二部分开始输出每个文件路径到结尾。由于第一部分是“。” 这正是我想要的

sort:因为 comm 需要排序列表 tu 函数(不用担心它会告诉你列表是否未排序)我们对列表进行排序

xargs git check-ignore --no-index:对于每个文件,我使用 xargs 工具运行 git check-ignore。--no-index 在这里非常重要,因为如果不存在检查忽略将不会返回 gitignore 覆盖但已经在源代码控制下的文件。

我希望这对像我这样来到旧的大型 gitup 存储库并且必须清理 gitignore 文件的人有所帮助。


推荐阅读