git 项目可以跟踪我的全局 git 忽略中列出的目录吗?

Can a git project track a directory listed in my global gitignore?

我正在处理一个需要跟踪其 node_modules 目录的项目。我真的不想删除我的全局 git忽略对该目录的引用,因为所有其他项目应该 跟踪 node_modules 目录。

有没有办法强制 git 在项目级别跟踪某些内容?或者我是否需要检查所有项目,验证每个项目都有自己的忽略,然后从全局中删除引用 gitignore?

是的,您可以向本地 .gitignore 添加一个否定,使 git 仅针对此项目跟踪它。

!node_modules

如果文件被跟踪,它在忽略文件中的存在将被忽略(如果我可以这样说:-))。

我一直说 .gitignore 是文件的错误名称,因为它不是真正的 "list of files to ignore"。相反,它有两个目的。 Git 在两种情况下检查忽略文件条目:

  • 当它抱怨有一个未跟踪的文件时,或者
  • 当它要破坏文件时不确定是否允许这样做。

第一种情况最常见于 git status:向您的忽略文件添加文件或模式告诉 git "please shut up about *.o and the like, they're not supposed to be tracked, so don't complain that they're not tracked." 在这种情况下,条目可能应该在名为 .git-shut-up-about-these-files.

的文件

第二种情况比较阴险。假设您在 git 存储库中有一个包含文件 a1a2 的提交,这就是您的 当前 提交(因为这是提示分支的,或者因为你做了 git checkout <commit>,或者其他什么,这两个文件在那个提交中:为了论证,我们假设这是 master 上的提示提交)。我们还假设您有 另一个 提交 1234567,只有文件 a1,没有 a2。如果你现在这样做:

git checkout 1234567

git 必须删除 文件a2。没关系,因为它在你的另一个提交中(master 的提示),a2 就在那里。如果你切换回去:

git checkout master

git 重新创建 a2.

但是如果在 master 的提示中有一个名为 important 的文件 而不是 1234567 中怎么办?你 git checkout 1234567 然后停下来做一些重要的笔记:

$EDITOR important

您写下那些重要的注释并退出编辑器,然后决定 git checkout master。 Git 现在需要破坏你刚刚写的笔记,因为 master 的提示包含一个名为 important.

的文件

在这种情况下,git 会检查您的忽略文件中的名称 important。如果它在那里,git 可以随意删除该文件并将其替换为提交中的文件。如果 不是 git checkout 会警告签出会覆盖 important 并要求您先将其移开。

这些文件名条目可能应该位于名为 .git-go-ahead-and-clobber-these-files-they-are-unimportant.

的文件中

请注意,您无法创建任何条目来标记文件 "not to be stored in the repostory, but precious: do not clobber"。