跟踪被忽略目录中的文件

Gab*_*iel 25 git git-commit

前段时间我将.gitignore文件设置为跟踪文件夹my_folder:

my_folder/
Run Code Online (Sandbox Code Playgroud)

现在我想只跟踪所述文件夹中的给定文件,名为my_file.md.制作后.gitignore是这样的:

my_folder/
!my_folder/my_file.md
Run Code Online (Sandbox Code Playgroud)

并检查:

git status
Run Code Online (Sandbox Code Playgroud)

该文件不会显示为要提交的更改.

我究竟做错了什么?


我尝试将.gitignore文件更改为:

my_folder/*
!my_folder/my_file.md
Run Code Online (Sandbox Code Playgroud)

正如所建议的那样,但是文件仍未显示为提交后的提交更改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
Run Code Online (Sandbox Code Playgroud)

该命令git check-ignore -v my_folder/my_file.md给出:

.gitignore:1:my_folder/*    my_folder/my_file.md
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 27

要添加到" .gitignore排除文件夹但包含特定子文件夹 ",调试这些.gitignore文件的一种好方法是使用git check-ignore(Git 1.8.4+):

git check-ignore -v my_folder/my_file.md
Run Code Online (Sandbox Code Playgroud)

由于my_folder/规则,您会看到它仍然被忽略.

这是因为如果排除该文件的父目录,则无法重新包含文件.(*)
(*:除非在git 2.?+中满足某些条件,请参见下文)

这就是为什么忽略该文件夹中的文件(my_folder/*而不是文件夹本身)允许您排除一个文件.

当然,你可以强制添加一个文件ignored(git add -f my_folder/my_file.md),但这不是这个答案的重点.
关键是要说明为什么增加!my_folder/my_file.md.gitignore不使用git 2.6或更低的工作.


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

NguyễnTháiNgọcDuy(pclouds)正在尝试添加此功能:

所以在这里,使用git 2.8+,这将工作:

/my_folder
!my_folder/my_file.md
Run Code Online (Sandbox Code Playgroud)


kni*_*ttl 23

如果尚未跟踪文件,则文件不会显示为"要提交的更改"(以前从未添加过IOW).只需添加文件git add,Git将仅跟踪文件,但仍然忽略该文件夹.

git add -f ignored_folder/my_file
Run Code Online (Sandbox Code Playgroud)

-f标志是重要的,因为git会拒绝来自忽略路径添加文件.


小智 5

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

resources/**/*.*
Run Code Online (Sandbox Code Playgroud)

这意味着“忽略资源目录(包括子目录)内所有具有扩展名的文件”。

然后我将一个“空”文件放入我想要跟踪的那些目录中。

请注意,只有无扩展名的文件才会被跟踪,这就是它起作用的原因。

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

!resources/my_needed_file.md
Run Code Online (Sandbox Code Playgroud)

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