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

Dav*_*ith 3 git gitignore

我正在使用Windows 7Git v2.8.3.

\n\n

我有一个包含存储库的目录结构Git

\n\n
testing_gitignore\n\xe2\x94\x82   .gitignore\n\xe2\x94\x82   file_1.txt\n\xe2\x94\x82   file_2.txt\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80dir_1\n\xe2\x94\x82       file_11.txt\n\xe2\x94\x82       file_12.txt\n\xe2\x94\x82       file_13.txt\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80dir_2\n    \xe2\x94\x82   file_21.txt\n    \xe2\x94\x82   file_22.txt\n    \xe2\x94\x82   file_23.xlsx\n    \xe2\x94\x82   file_24.txt\n    \xe2\x94\x82\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80dir_21\n            file_211.txt\n            file_212.xlsx\n            file_213.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

在里面.gitignore我使用了以下内容:

\n\n
/dir_2/*\n/dir_2/**/*\n!/dir_2/*.xlsx\n!/dir_2/**/*.xlsx\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我没有成功,因为我将文件作为文件添加到commit以下列表(您也可以在此处看到):

\n\n
.gitignore\nfile_1.txt\nfile_2.txt\ndir_1\\file_11.txt\ndir_1\\file_12.txt\ndir_1\\file_13.txt\ndir_2\\file_23.xlsx\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我希望它应该包含在文件中(作为要提交的文件):

\n\n
dir_2/dir_21/file_212.xlsx\n
Run Code Online (Sandbox Code Playgroud)\n\n

您能给我一个.gitignore配置来实现此目的吗?\n(在此处发布之前,您可以使用我之前在链接上附加的下载目录结构自行尝试一下吗?)

\n

Von*_*onC 5

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

/dir_2/**/*
!/dir_2/**/
Run Code Online (Sandbox Code Playgroud)

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

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

!/dir_2/**/*.xlsx
Run Code Online (Sandbox Code Playgroud)

主要规则.gitignore仍然是:

如果排除某个文件的父目录,则无法重新包含该文件。

因此,忽略文件文件夹(带有“ /**/*”)意味着您将无法重新包含文件,除非它们的父文件夹本身被重新包含(带有!/**/:尾部斜杠表示“文件夹”)。
满的.gitignore

/dir_2/**/*
!/dir_2/**/
!/dir_2/**/*.xlsx
Run Code Online (Sandbox Code Playgroud)

请注意,您不必提交 a.gitignore来测试其效果:修改它,然后执行 a git status:只要那些未跟踪的文件(git rm -r --cached dir_2首先执行 a ),这些规则的效果将立即生效。

完成后.gitignore,执行 agit add .和 a git status:它应该只在添加时显示*.xlsx在下面。dir_2/

[注意下划线]