跟踪被忽略目录中的文件

时间:2014-10-04 02:39:29

标签: git git-commit

前段时间我将.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

4 个答案:

答案 0 :(得分:22)

要添加到" .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

答案 1 :(得分:20)

文件不会显示为"更改为已提交"如果还没有跟踪(以前从未添加过IOW)。只需使用git add添加文件,Git将仅跟踪文件,但仍然会忽略该文件夹。

git add -f ignored_folder/my_file

-f标志很重要,因为git会拒绝从忽略的路径中添加文件。

答案 2 :(得分:3)

当我需要这样的跟踪文件或仅需要目录结构时,我将这样的内容添加到我的.gitignore文件中

resources/**/*.*

表示"忽略资源目录中包含扩展名的所有文件,包括子目录"。

然后我把一个"空"我希望跟踪这些目录中的文件。

请注意,只会跟踪无扩展名文件,这就是原因。

使用上面列出的选项,您现在可以添加:

!resources/my_needed_file.md

这是另一个不包含强制文件的解决方案,但如果您使用带扩展名的文件,则只是一个选项。

我希望这有助于某人。

答案 3 :(得分:0)

我的解决方案:

resources/**/*.*

然后在该行的否定词之后添加

!resources/my_needed_file.md