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 存储库中有一个包含文件 a1
和 a2
的提交,这就是您的 当前 提交(因为这是提示分支的,或者因为你做了 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"。
我正在处理一个需要跟踪其 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 存储库中有一个包含文件 a1
和 a2
的提交,这就是您的 当前 提交(因为这是提示分支的,或者因为你做了 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"。