我将以下行添加到.gitignore
,但是当我键入git status
时,它会将该文件显示为非暂存文件。有什么问题?所有其他模式都运作良好。
.gitignore
文件内容:
sites/default/settings.php
答案 0 :(得分:247)
确保您的.gitignore
位于工作目录的根目录中,并在该目录中运行git status
并从状态输出中复制文件的路径,将其粘贴到.gitignore
。
如果这不起作用,那么Git可能已经跟踪了您的文件。您可以通过git status
的输出进行确认。如果该文件未列在“未跟踪文件”部分中,则Git已经跟踪该文件,它将忽略.gitignore
文件中的规则。
忽略Git中文件的原因是它们不会被添加到存储库中。如果您之前添加了一个要忽略的文件,那么它将被Git跟踪,并且将跳过与其匹配的忽略规则。 Git这样做,因为该文件已经是存储库的一部分。
为了实际忽略该文件,您必须将其删除并将其从存储库中删除。您可以使用git rm --cached sites/default/settings.php
执行此操作。这将从存储库中删除文件而不会物理删除文件(这就是--cached
所做的)。提交更改后,该文件将从存储库中删除,忽略它应该可以正常工作。
答案 1 :(得分:87)
我遇到这个问题,这是一个老问题,但我希望跟踪该文件,但不要在某些工作副本上跟踪它,为此可以运行
git update-index --assume-unchanged sites/default/settings.php
答案 2 :(得分:35)
.gitignore只会忽略您尚未添加到存储库的文件。
如果您执行了git add .
,并且该文件已添加到索引中,.gitignore将无法帮助您。你需要git rm sites/default/settings.php
删除它,然后它将被忽略。
答案 3 :(得分:24)
请使用此命令
git rm -rf --cached .
git add .
有时.gitignore文件即使正确也无法正常工作。 Git忽略文件的原因是它们没有添加到存储库中。如果您添加了以前要忽略的文件,则Git将对其进行跟踪,并且所有跳过的匹配规则都将被跳过。 Git这样做是因为文件已经是存储库的一部分。
答案 4 :(得分:10)
我遇到了同样的问题。 .gitingore
中定义的文件,在运行git status
时列为未跟踪文件。
原因是.gitignore
文件以UTF-16LE
编码保存,而不是UTF8
编码。
将.gitignore
文件的编码更改为UTF8
后,它对我有效。
答案 5 :(得分:2)
我成功忽略了 settings.php 文件的操作:
我认为,如果Git上存在已提交的文件,则忽略无法按预期工作。只需删除文件并提交即可。之后,它将忽略。
答案 6 :(得分:1)
我刚用git 1.7.3.1尝试了这个,并给出了如下结构:
repo/.git/
repo/.gitignore
repo/sites/default/settings.php
其中repo
因此是上面提到的“根”(我将其称为工作树的根),而.gitignore
仅包含sites/default/settings.php
,忽略对我有效(是否将.gitignore
添加到仓库并不重要。这与你的回购布局相符吗?如果没有,有什么不同?
答案 7 :(得分:1)
确保.gitignore没有扩展程序!!它不能是.gitignore.txt,在Windows中只是命名文件.gitignore。它会起作用。
答案 8 :(得分:0)
以防将来有人遇到与我相同的问题:
如果您使用
*
!/**/
!*.*
删除没有扩展名的二进制文件的技巧,确保所有其他gitignore行都在下面。 Git将从顶部读取.gitignore,所以即使我在我的gitignore中有'test.go',它仍然是文件中的第一个,并且在
之后变得“无人”。!*.*
答案 9 :(得分:0)
有实例,例如我想在git中跟踪应用程序配置文件(因此.gitignore将不起作用),但是我需要更改本地设置。我不希望git管理这些文件或将其显示为已修改。为此,我使用skip-worktree:
git update-index --skip-worktree path/to/file
您可以通过列出文件并检查以S开头的行来跳过文件来确认文件被跳过
git ls-files -v | grep ^S
如果将来您想让git在本地再次管理文件,只需运行:
git update-index --no-skip-worktree path/to/file
上面的Mescalito有一个很好的答案,这使我走了正确的路,但是
git update-index-假设未更改的文件/to/ignore.php
与git有一个合同,其中:用户承诺不更改文件,并允许Git假定工作树文件与索引中记录的文件匹配。
但是,我更改了文件的内容,所以在我的情况下--skip-worktree是更好的选择。
西那敏治(Toshiharu Nishina)的网站很好地解释了跳过工作树与假设不变的情况:Ignore files already managed with Git locally
答案 10 :(得分:0)
另一个可能的原因 – 一些同时运行git客户端的实例。例如“ git shell” +“ GitHub Desktop”等。
这发生在我身上,我使用“ GitHub Desktop”作为主要客户端,并且它忽略了一些新的.gitignore设置:提交后提交:
原因:Visual Studio Code编辑器在后台运行且具有相同的打开的存储库。 VS Code具有内置的git控件,这会引起一些冲突。
解决方案:仔细检查多个隐藏的git客户端,一次只使用一个git客户端,尤其是在清除git缓存时。
答案 11 :(得分:0)
我在VS Code终端上尝试了上述大多数命令,但出现类似以下错误:
fatal: pathspec '[dir]/[file]' did not match any files
我在GitHub Desktop上打开了该项目,然后从那里忽略了它,
答案 12 :(得分:0)
我认为,此处的出色答案中缺少的一件事是,如果another *.gitignore* or multiple of them.
在一种情况下,我克隆了一个存储库,无法弄清为什么在运行 git add 时再次添加“忽略的”文件。结果表明,子文件夹中还有一个 .gitignore ,并且该文件覆盖了根文件夹中的那个。
/.gitignore
/some-folder/.gitignore
/some-folder/this-file-keeps-getting-staged
The
root /.gitignore
忽略了此文件保存阶段
The
/some-folder/.gitignore
没有说明可以忽略“此文件保存阶段”文件。
因此是问题。
其中之一是简单地在层次结构中搜索多个.gitignore文件。并找出适用的规则。
答案 13 :(得分:0)