Git - 如何递归地忽略一个目录中的所有文件,但保留特定扩展名的一些文件

3

我正在使用Windows 7Git v2.8.3

我拥有这个目录结构,其中包含一个Git仓库。

testing_gitignore
│   .gitignore
│   file_1.txt
│   file_2.txt
│
├───dir_1
│       file_11.txt
│       file_12.txt
│       file_13.txt
│
└───dir_2
    │   file_21.txt
    │   file_22.txt
    │   file_23.xlsx
    │   file_24.txt
    │
    └───dir_21
            file_211.txt
            file_212.xlsx
            file_213.txt

我想配置 .gitignore 文件,以便递归地忽略 dir_2 内的所有文件,但保留(提交)扩展名为 .xlsx 的文件(递归)。

.gitignore 中,我使用了以下内容:

/dir_2/*
/dir_2/**/*
!/dir_2/*.xlsx
!/dir_2/**/*.xlsx

但我没有成功,因为我需要提交以下列表中的文件(您也可以在这里看到):commit

.gitignore
file_1.txt
file_2.txt
dir_1\file_11.txt
dir_1\file_12.txt
dir_1\file_13.txt
dir_2\file_23.xlsx

但我认为应该把文件(作为提交的文件)包括在内:

dir_2/dir_21/file_212.xlsx

你能给我一个.gitignore配置文件,以达到这个目的吗?(在发布之前,你可以通过我提供的链接下载相应的目录结构并自行尝试)

1个回答

5
尝试忽略文件但重新包含文件夹:
请忽略指定的文件,但仍然包含目标文件夹。
/dir_2/**/*
!/dir_2/**/

(注意第一条规则中的/**/*:它递归地忽略所有文件和文件夹,然后在第二个规则中重新包含文件夹!/**/)。

然后您可以重新包含文件(因为它们所在的文件夹没有被忽略)。

!/dir_2/**/*.xlsx

主要规则关于.gitignore仍然是: 如果一个文件的父目录被排除,那么不可能重新包含该文件。 因此忽略文件和文件夹(使用'/**/*')意味着您将无法重新包含文件,除非它们的父文件夹本身被重新包含(使用!/**/:斜杠表示“文件夹”)。完整的.gitignore如下:
/dir_2/**/*
!/dir_2/**/
!/dir_2/**/*.xlsx

请注意,您不必提交.gitignore以测试其效果:修改它并执行git status:只要那些文件没有被跟踪(首先执行git rm -r --cached dir_2),这些规则的效果就会立即生效。
有了这个.gitignore后,执行git add .git status:它应该只显示dir_2/下的*.xlsx被添加了。
[请注意下划线]

你能再多解释一下吗?我尝试了你的前三行代码,但没有成功。谢谢。 - David Smith
我尝试了你的最后三行代码,但还是不起作用。我还没有进行任何commit操作(甚至没有初始提交),所以我认为我不需要执行git rm命令。 - David Smith
@DavidSmith git status 返回什么?(还有您的 git version 是多少?) - VonC
git status 命令返回的结果见 此图片。我正在使用 Windows 7Git v2.8.3 - David Smith
@DavidSmith 好的:经过测试,我已经修复了答案。 - VonC
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接