.gitignore不起作用:应该被忽略的文件仍然被提交

29

我正在尝试从现有文件夹创建新的Git存储库。我已经在该文件夹的根目录下创建了一个.gitignore文件。但是如果我输入以下命令:

git add *
git commit
git push

在 Windows 上,应该忽略的文件仍然被提交到远程存储库。我购买了 SmartGIT 的许可证,但它似乎也忽略了 .gitignore。我必须手动选择要提交的新文件。


3
你使用的 Git 版本是哪个?此外,你提到你正在使用 Windows,所以路径分隔符总是会引起麻烦。你可以发一个你的 .gitignore 文件的例子,说明为什么不按预期工作吗? - Greg Hewgill
2
你能否编辑你的问题并发布.gitignore文件的内容?.gitignore将使用底层操作系统特定的fnname()方法:例如请参见:https://dev59.com/u3E95IYBdhLWcg3wY8_6和https://dev59.com/T3M_5IYBdhLWcg3wPAZF。 - VonC
我没有听说过SmartGIT - 我使用MSysGit和TortoiseGit,它们似乎能很好地处理.gitignore文件。如果问题出在SmartGIT上,那么我会尝试使用MSysGit和TortoiseGit这个替代方案。 - Geoff Adams
请发布 git status 的结果和 .gitignore 的内容。 在 msysgit 上,目录分隔符是正斜杠:/,你的情况是怎样的? - Gauthier
请查看这个问题,它更详细地涵盖了这个问题... - buildsucceeded
10个回答

30

您的文件仍需被跟踪,您可以通过执行git status来查看,即使它在.gitignore中也会显示该文件已修改。
您需要执行以下操作:

git update-index --assume-unchanged [path_to_file]

这应该是被接受的答案,所以在将文件(s) 添加到 .gitignore 后,它仍然会在 git status 中显示出来。在上述命令之后,我得到了期望的结果。 - Adeel Shekhani
这应该是被接受的答案,所以在将文件添加到.gitignore后,它仍然会在git status中显示出来。在上述命令之后,我得到了期望的结果。 - undefined

27

请使用 "git add ." 代替。

并且,在Linux上我可以运行以下命令:

$ git init
$ echo foo > .gitignore
$ echo foo > foo
$ echo bar > bar
$ git add -v *
以下路径被您的 .gitignore 文件中的一个忽略:
foo
如果您真的想添加它们,请使用 -f。
致命错误:没有添加任何文件

24

你的文件已经被追踪了吗?.gitignore 文件只会忽略关于未被追踪文件的注释,但不会防止已被追踪的文件继续被追踪。


12

我也遇到了.gitignore的问题。我查看了提供的链接,解决了一半的问题。

使.gitignore完全起作用的关键是在文件的第一行添加注释。Git无法解析位于第一行的排除内容。

干杯


2
在Windows上添加注释对我也起作用了。给你点赞! - Jay D.
1
很遗憾,我自己先发现了这个问题...然后才看到了你的评论。现在要看看这是否是一个应该修复的错误! - altendky

6

您可以创建一个UTF-8编码的文本文件。尝试将其保存为ANSI编码。在git bash中,您可以使用vi -b进行验证。


似乎是原因。我没有使用 vi -b,但在从头开始重写 .gitignore 后它起作用了。 - Javier

4
我在windows上遇到的一个问题是,在使用echo时(如Jakub Narębski的答案所述),你必须小心空格。
正如下面所示,重定向运算符之前的任何空格都会对实际忽略产生影响。
C:\test>dir /B
TOBEIGNORED

C:\test>echo TOBEIGNORED > .gitignore
C:\test>git status
[...]
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
#       TOBEIGNORED
C:\test>echo TOBEIGNORED> .gitignore
C:\test>git status
[...]
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
nothing added to commit but untracked files present (use "git add" to track)

1
不要在Windows上使用ECHO,否则你将浪费3个小时来弄清楚为什么.gitignore就是不起作用。 - Mmmh mmh

0

文件的第一行注释非常重要!我花了很多时间尝试排除文件,结果发现GIT忽略了忽略文件中的第一行。


这绝对不是问题所在。我的gitignore文件中几乎没有一个(约50个)在第一行有注释,它们都可以完美地工作。 - mhutter

0

可能你的排除文件遮罩不准确。


我从另一个项目中复制了 .gitignore 文件,在那个项目中它是有效的。 - John Grey
.gitignore文件对git用户是否可访问?也许这是一个权限问题? - takeshin

0

我在MacOSX上使用git版本1.7.12.3,但.gitignore的第一行也没有被考虑在内。只需将注释添加为第一行即可。


0

我最后执行了echo node_modules >> .gitignore,但它没有起作用。

Windows终端以UCS-2 LE BOM格式保存文件,而Git不接受该格式。

当我使用Notepad打开文件并以UTF-8编码保存时,它最终起作用了。

notepad save utf-8 encoding

那时它工作得很好。

我认为他们需要修复这个问题,因为echo "filetoignore" >> .gitignore实际上是一件方便的事情。


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