"!"不会排除.gitignore文件中的文件。"

3

我的 .gitignore 文件:

.DS_Store
temp
!temp/script.txt

然而,当我执行git status命令时,它并不显示temp/目录,也没有显示script.txt文件未被暂存。它只显示了.gitignore文件:

# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   .gitignore

我正在学习git。你有什么想法,我到底哪里错了吗?


你不能使用.gitignore来忽略已经被Git版本控制的文件。 - John Szakmeister
@jszakmeister 这里不相关。 - sehe
@sehe 你可能是对的(这就是为什么我没有将其写成答案),但双重否定“它不显示temp/目录以指示script.txt不在暂存区”使其听起来像是工作树的一部分。 - John Szakmeister
2个回答

3

temp替换为:

temp/*

这将忽略目录中的所有文件。在大多数情况下,temptemp/temp/*都可以达到相同的效果,因为在前两种情况下,目录被忽略,而在第三种情况下,Git不会跟踪空目录。因此,目录本身将被忽略。
为了说明这一点,当temp/包含temp1.txt temp2.txt temp3.txt时,基本上会发生什么:
temp # anything with the name of "temp"; a directory, a symlink, a file.
temp/ # whole of temp dir
temp/* # temp/temp1.txt temp/temp2.txt temp/temp3.txt

因此,第三种情况将在您的情况下起作用。
否定模式必须放置在涵盖它的模式之后。在本例中,!temp/script.txt 必须放在 temp/* 之后。否则,它将不会被应用。
因此,您的最终 .gitignore 文件应该如下所示:
.DS_Store
temp/*
!temp/script.txt

请注意,您必须非常小心地观察包含/排除的顺序。另外,“temp”将忽略名称为“temp”的文件,“temp/”仅忽略该目录中的(任何)文件。 - sehe
@sehe 是的,我会确保添加进去。我排除了那个是为了避免混淆。 - wei2912

0

注意,在 Git 中,目录不是有版本控制的。

使用 .gitignore 文件来忽略它们。

temp/*
!temp/script.txt

注意,顺序非常重要(我一开始弄错了,所以差点得出结论说这是不可能做到的)

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