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

时间:2016-11-21 20:09:26

标签: git gitignore

我将Windows 7Git v2.8.3一起使用。

我有this directory structure,其中包含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文件作为以下列表(您还可以看到here):

.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 个答案:

答案 0 :(得分:4)

尝试忽略文件但重新包含文件夹:

/dir_2/**/*
!/dir_2/**/

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

然后你可以重新包含文件(因为它们的文件夹不被忽略)

!/dir_2/**/*.xlsx

关于.gitignore的主要规则仍然存在:

It is not possible to re-include a file if a parent directory of that file is excluded.

因此忽略文件文件夹(带有“/**/*”)意味着您将无法重新包含文件,除非他们的父文件夹本身被重新包含({{1}尾部斜杠表示'文件夹') 完整!/**/

.gitignore

请注意,您不必提交/dir_2/**/* !/dir_2/**/ !/dir_2/**/*.xlsx 来测试其效果:修改它,并执行.gitignore:只要那些未跟踪的文件(执行git status首先),这些规则的效果将立竿见影。

使用git rm -r --cached dir_2,执行.gitignoregit add .:它应该只在git status下显示*.xlsx作为添加。

[注意下划线]