跟踪被忽略目录中的文件

42

不久前,我设置了我的.gitignore文件,以使其跟踪一个名为my_folder的文件夹:

my_folder/

现在我想要追踪文件夹内指定的文件,名称为my_file.md。修改 .gitignore 如下:

my_folder/
!my_folder/my_file.md

并进行检查:

git status

文件似乎没有改动,无需提交。

我做错了什么?


Add(添加)

我试图将.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

1
重复 - 但简短的答案是使用“my_folder / *”https://dev59.com/eW035IYBdhLWcg3wPdkS - Andrew C
谢谢@AndrewC,我尝试了那个方法,但还是不起作用。不确定我做错了什么。 - Gabriel
2
既然你真的想添加my_folder/my_file.md,为什么不使用-f标志,因为它告诉你要这样做呢? - Petr Skocik
1
请注意:在git 2.8版本(2016年3月)中,您的.gitignore规则最终将生效!详情请参见我的下面编辑过的答案 - VonC
1
不,我很久以前就在我的答案中包含了另一个答案。我的答案更完整,回答了你最初的问题。另一个答案没有这样做。 - VonC
显示剩余2条评论
4个回答

42

除了.gitignore将文件夹排除但包含特定子文件夹之外,另一种好的调试.gitignore文件的方法是使用git check-ignore(Git 1.8.4+):

git check-ignore -v my_folder/my_file.md

由于my_folder/规则的存在,您会发现它仍然被忽略。

这是因为如果一个文件的父目录被排除了,就不可能重新包含该文件。(*)
(*:除非在git 2.0+中满足某些条件,请参见下文)

这就是为什么忽略该文件夹内的文件my_folder/*,而不是该文件夹本身)允许您排除其中一个文件的原因。

当然,您可以强制添加已被忽略的文件(git add -f my_folder/my_file.md),但这不是这个答案的重点。
重点是解释为什么在.gitignore中添加!my_folder/my_file.md在git 2.6或更低版本中无法正常工作。


请注意,在git 2.9.x/2.10(2016年中期?)中,如果路径重新包含时没有通配符,可以重新包括文件,即使该文件的父目录被排除。

Nguyễn Thái Ngọc Duy(pclouds正在尝试添加此功能:

因此,在git 2.8+中,这将起作用:

/my_folder
!my_folder/my_file.md

1
@Gabriel,你有试过加入吗?git add my_folder/my_file.md。执行git check-ignore -v my_folder/my_file.md,它返回了什么? - VonC
@Gabriel strange:只需修改.gitignore(应与my_folder在同一父文件夹中)即可立即生效。 - VonC
@Gabriel 你确定 my_file.md 的命名是正确的吗?也就是说大小写是否正确?(应该是 my_file.md 而不是 MyFile.MD)或者文件名后面没有多余的空格? 'my_file.md ' - VonC
这很奇怪。为了确保,我重命名了文件夹和文件,然后git立即检测到了它。我百分之百确定名称是正确的(我发誓,我检查了很多很多次)。我将文件夹和文件改回原始名称,现在文件被正确跟踪。真的,不知道这里发生了什么,但现在已经解决了。谢谢VonC! - Gabriel
@Vonc 如 knittl 在下面所述 git add -f ignored_folder/my_file 即可! - Jean Davy
显示剩余2条评论

38
如果一个文件尚未被跟踪(即以前从未添加过),它将不会显示为“要提交的更改”。只需使用git add添加该文件,Git 将仅跟踪该文件,但仍会忽略文件夹。

如果一个文件尚未被跟踪(即以前从未添加过),它将不会显示为“要提交的更改”。只需使用git add添加该文件,Git 将仅跟踪该文件,但仍会忽略文件夹。

git add -f ignored_folder/my_file

-f 标志非常重要,因为git将拒绝添加来自被忽略路径的文件。


即使我有 !my_folder/my_file.md,我仍然需要 git add -f my_folder/my_file.md - onmyway133
1
这可能对一些人有所帮助(如果他们没有在.gitignore中使用!模式),但是被接受的答案更精确,因为它处理了.gitignore文件中实际问题,而不是如何强制添加被忽略文件夹中的文件。 - Nader Ghanbari
如果文件在多个文件夹层级中,例如:ignored_folder/ignored_subfolder1/ignored_subfolder2/my_file,那么这个解决方案比被接受的答案更有帮助。 - Dika

5
当我需要跟踪像这样的文件,或仅仅是目录结构时,我会在我的.gitignore文件中添加类似下面这样的内容。
resources/**/*.*

这意味着,“忽略资源目录及其子目录中所有带有扩展名的文件”。然后,在我想跟踪的那些目录中放置一个“空”文件。请注意,只有没有扩展名的文件将被跟踪,这就是为什么它有效的原因。使用上述选项,现在您可以添加以下内容:
!resources/my_needed_file.md

这是另一种解决方案,它不包括强制文件,但只适用于使用带有扩展名的文件。


实际上,我的解决方案是在那些我想要被跟踪的目录中留下一个没有扩展名的文件,以避免强制跟踪文件。而且,这个解决方案的另一个好处是,你只需要在你想要跟踪的树的最深层目录中添加那些没有扩展名的文件,但保持“空白”。 - BarzX ___

-1

我的解决方案:

resources/**/*.*

然后在这行代码之后加入否定:after

!resources/my_needed_file.md


2
这是另一个答案的副本(https://dev59.com/D18e5IYBdhLWcg3wAWns#46148039)。 - Melebius

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