我将Windows 7
与Git 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
配置来实现这个目标吗?
(在发布之前,您可以自己尝试使用我之前附加的目录结构在链接上下载吗?)
答案 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
,执行.gitignore
和git add .
:它应该只在git status
下显示*.xlsx
作为添加。
[注意下划线]