Git全局忽略文件不起作用

114

我已经创建了名为 .gitignore_global 的文件,并将其放在我的 git 安装目录中。当我运行命令:

git config --global core.excludesfile ~/.gitignore

我提交的代码中忽略文件中的规则没有生效。

当我将 .gitignore 文件重命名并放置在项目根目录下时,规则开始生效。

这里出了什么问题?


1
@Jarrod OP 实际是指 ~/.gitignore_global,而帖子中只是一个打字错误。尽管他已经接受了我的回答,但你的编辑并不正确。 - CharlesB
这个回答解决了你的问题吗?全局 Git 忽略 - codeforester
3
我看到这个问题因为它对我也没有用。我的问题是写成了core.excludesfile而不是小写字母F的core.excludesFile。希望这能帮助任何遇到类似情况的新手。 - Bibek Aryal
请在此处查看视频:https://youtu.be/3LYBdd3RGKs - Shailesh Ladumor
16个回答

219
也许你需要做以下事情:
git config --global core.excludesFile ~/.gitignore_global 

喝点咖啡。

抱歉,那就是我想表达的意思。我复制的那个只是为了试验哪些有效而已。 - user880954
咖啡和牙齿都是真的。你确定.gitignore_global在你的$HOME目录下吗?你说你把它安装在git安装目录里了? - CharlesB
6
是的,.gitignore 文件仅适用于未跟踪的文件,对于那些已经添加的文件则不起作用。 - CharlesB
尝试执行 git config --global core.excludesfile 命令,查看打印出的文件,然后去编辑那个文件,这种方式对我很有效。我猜第二个文件是你想要追加忽略的文件。 - Wei Lin
1
我刚注意到的另一件事是.gitignore_global文件中的行模式必须与项目主目录下的路径完全匹配。例如,如果项目名称为myProject,并且在myProject/sql/init中生成SQL代码,您想要忽略myProject/sql/init/.sql条目必须是 /sql/init/。同样,在myProject/msg/dao/和myProject/dao中生成的DAO / DTO代码必须有两个条目来捕获dao子目录中的所有文件-需要添加/**/dao/和/dao/。 - Keith Kibler
显示剩余4条评论

120

我想在这方面提供一些帮助。出现全局忽略文件无法起作用的另一个原因是有一些之前的答案没有涵盖到的情况。这个情况非常明显,以至于很容易被忽略。

这个情况就是,Git只会忽略新添加的文件。如果该文件已被Git追踪,那么Git自然不会忽略它!所以任何.gitignore.git/info/exclude文件中的模式并不适用。

这是有道理的。Git为什么要忽略已经被追踪的文件的修改呢?如果要忽略该文件,则必须首先告诉Git不要跟踪它,然后按照手册中的说明进行忽略。关于如何取消跟踪文件的信息,请参见此答案

这让我想问,是否可能忽略已跟踪文件的更改?再次,Git提供了解决方案。这篇回答;Git:忽略已跟踪文件给出了命令(将file替换为要忽略的文件):

git update-index --assume-unchanged file

最后,这里还有一些关于调试Git忽略的附加信息。

gitignore(5)手册页告诉我们:

用户希望在所有情况下都忽略Git的模式(例如,用户选择的编辑器生成的备份或临时文件)通常会放入由用户的~/.gitconfig中的core.excludesfile指定的文件中。它的默认值是$XDG_CONFIG_HOME/git/ignore。如果$XDG_CONFIG_HOME未设置或为空,则改为使用$HOME/.config/git/ignore。

因此,这是新的,替换了之前提到的~/.gitignore_global

接下来,这是非常有用的,从1.8.2版本开始,我们现在拥有了一些优秀的调试工具。请看:

Git学会更好地忽略——1.8.2版本的新特性

这展示了如何使用新的check-ignore标志来验证git是否成功地忽略了您的模式,例如:

git check-ignore bin/a.dll --verbose


我运行了 git check-ignore . 命令,但是它提示无法访问 ''C:\Users....gitignore''。然后我意识到需要去掉单引号,于是通过编辑 ~.gitconfig 文件将其删除。 - Mithil Poojary
请注意,即使这样做可以起作用,但是存在一个巨大的问题。比如你根据需要修改了文件并使用该命令将其保存,然后你对所有文件进行了git stash操作,那么被保存的文件也会被隐藏。当你执行git stash pop时,这些文件不会被恢复。因此,你实际上失去了更改,并且必须再次修改这些文件。 - 15 Volts
1
太好了,谢谢!"update-index"对我来说解决了问题。:) 实际上,对我来说,这根本不是一个“显而易见”的事情。 - Ellis

19

我发现当我像这样定义 global core.excludesfile 时:

git config --global core.excludesfile $HOME/.config/git/ignore

它没有起作用。将其更改为不使用$HOME变量,像这样:

git config --global core.excludesfile ~/.config/git/ignore

它立即开始工作。希望这能帮助其他人。

FYI:

$ git --version
git version 1.7.10.2 (Apple Git-33)

我也注意到了这一点。我浏览了文档,但没有找到任何东西:除了.gitignore(每个目录)和.git/info/exclude之外,git还会查找此文件中不希望被跟踪的文件模式。"/"会扩展为$HOME的值,"user/"会扩展为指定用户的主目录。 - rliu
这就是修复。 - Erez
没意识到这个,谢谢! - undefined

11
注意:从git1.7.12(2012年8月)开始:

当这些文件存在时:

  • core.attributesfile的值默认为$HOME/.config/git/attributes,
  • core.excludesfile的值默认为$HOME/.config/git/ignore。

因此,如果您创建了一个$HOME/.config/git/attributes文件,则甚至不需要设置core.excludesfile设置。


4
我之前遇到了这个问题是因为我最初调���了 'git config core.excludefiles' 命令时没有加上 --global 参数并且赋予了错误的值,因此它将属性存储在本地。似乎本地属性掩盖了全局属性(其具有正确的值),完全忽略了它。

这也是我的问题。花了一点时间才找到。 - yarian
我也是。在调试时,我在一个仓库中执行了 git config core.excludesfile .gitignore 命令。后来不得不进入 .git/config 文件并删除 [core]/excludesfile 行才能使其再次正常工作。 - Yuri Ghensev

4
文件必须位于你的主目录中。在Windows上,通常指的是: C:\documents and settings\[用户]。 在Linux上,则为: /home/[用户]。

3

我还遇到了一个与文件编码有关的有趣问题。不知何故,我的Windows 10(使用PowerShell)使用“UTF-16 LE”编码创建了该文件,但Git无法处理它。当我将编码更改为其他任何更合理的值时,它就可以正常工作了。


3

补充一点可能被人们忽略的事情,或者至少是我犯的错误。

我没有复制粘贴命令,并且拼错了
excludefile(错误)
而应该是
excludesfile(正确)
在重新检查拼写之前,我已经失去了大约半个小时左右的时间,认为它是其他问题。

如果设置了无效选项,则不会收到警告或错误。如果语法无效,您将收到警告/错误消息,这就是为什么我错误地认为拼写错误会以相同的方式被捕获。


2
另一个全局 git ignore 不起作用的原因:路径中有不可见字符。
当我将 git-check-ignore 的警告信息粘贴到 Chrome 的地址栏中时,我才发现这是我的问题,幸运地,它变得可见了。

enter image description here

在终端上看不到。这可能会是一个漫长的调试过程...

1
我遇到了同样的问题(在Windows上)。最终我检查了我的~/.gitconfig文件,发现我的excludesfile被设置为:
excludesfile = C:\\Users\\myUserName\\Documents\\gitignore_global.txt

但实际应该是:

(以下省略)

excludesfile = C:\\Users\\myUserName\\.gitignore_global

我修改后,一切都按照预期运行了。


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