前段时间我设置了我的.gitignore
文件,以便不跟踪文件夹my_folder
:
my_folder/
现在我想只跟踪所述文件夹中的给定文件,名为my_file.md
。制作.gitignore
后看起来像这样:
my_folder/
!my_folder/my_file.md
并检查:
git status
该文件不会显示为要提交的更改。
我究竟做错了什么?
加
我尝试将我的.gitignore
文件更改为:
my_folder/*
!my_folder/my_file.md
正如所建议但该文件仍然没有显示为git status
后提交的更改。我需要重置一些东西吗?
加2
尝试使用git add my_folder/my_file.md
添加文件会返回:
The following paths are ignored by one of your .gitignore files:
my_folder/my_file.md
Use -f if you really want to add them.
fatal: no files added
命令git check-ignore -v my_folder/my_file.md
给出:
.gitignore:1:my_folder/* my_folder/my_file.md
要添加到“.gitignore
exclude folder but include specific subfolder”,调试这些.gitignore文件的一个好方法是使用git check-ignore
(Git 1.8.4+):
git check-ignore -v my_folder/my_file.md
由于my_folder/
规则,您会看到它仍然被忽略。
这是因为如果排除该文件的父目录,则无法重新包含文件。(*
)
(*
:除非在git 2.?+中满足某些条件,见下文)
这就是为什么忽略该文件夹中的文件(my_folder/*
,而不是文件夹本身)允许您排除一个文件。
当然,你可以强制添加一个忽略的文件(git add -f my_folder/my_file.md
),但这不是这个答案的重点。
关键是要解释为什么在!my_folder/my_file.md
中添加.gitignore
不适用于git 2.6或更低版本。
请注意,使用git 2.9.x / 2.10(2016年中期?),如果排除该文件的父目录if there is no wildcard in the path re-included,则可以重新包含文件。
Nguyễn Thái Ngọc Duy (pclouds
)正在尝试添加此功能:
所以在这里,使用git 2.8+,这将工作:
/my_folder
!my_folder/my_file.md
如果尚未跟踪文件,则文件不会显示为“要提交的更改”(以前从未添加过IOW)。只需使用git add
添加文件,Git将仅跟踪文件,但仍然忽略该文件夹。
git add -f ignored_folder/my_file
-f
标志很重要,因为git会拒绝从忽略的路径添加文件。
当我需要这样的跟踪文件,或者只需要目录结构时,我会将这样的内容添加到我的.gitignore文件中
resources/**/*.*
这意味着,“忽略包含子目录的资源目录中包含扩展名的所有文件”。
然后我在我想要跟踪的目录中放入一个“空”文件。
请注意,只会跟踪无扩展名文件,这就是为什么这样做的原因。
使用上面列出的选项,您现在可以添加:
!resources/my_needed_file.md
这是另一个不包括强制文件的解决方案,但如果您使用带扩展名的文件,则只是一个选项。
我希望这可以帮助别人。
我的解决方案
resources/**/*.*
然后在这一行之后添加否定:
!resources/my_needed_file.md