.gitignore 没有正确忽略文件

.gitignore not ignoring a file properly

我有一个项目,其结构如下:

build/
.git/
.gitignore
LICENSE
pics/
project.c
README.md
shared/
solutions/

我的 build/ 文件夹是我使用 CMake 的地方,所以有各种文件,如 CMakeCache.txtCMakeLists.txt 等,我希望 git 忽略它们。

我的 .gitignore 文件有:

.gitignore
*.out
*.swp
/build/*

当我 运行 git statusmodified: CMakeLists.txt 我不明白。为什么 CMakeLists.txt 没有被忽略?为什么它是唯一没有被忽略的文件?

由于 git ls-files --error-unmatch build/CMakeLists.txt 没有向您显示任何错误,这意味着 build/CMakeLists.txt 文件已经在您的存储库中被跟踪,因此 .gitignore 文件不再影响它。您需要 运行 git rm --cached build/CMakeLists.txt 才能将其从 git.

中删除

忽略规则(如 .gitignore 中的规则)仅适用于 未跟踪 文件。不能忽略对跟踪文件的更改。人们喜欢为这个用例建议一些机制,但它们都会造成比解决问题更多的麻烦。

(我们知道有问题的文件已被跟踪,因为 git 告诉您它已 修改 。这意味着该文件的一个版本已经在索引中.)

如果您从索引中删除文件,则可以应用忽略规则。这意味着从这次提交开始,repo 包含文件的 no 版本。如果你想忽略成功覆盖整个 build 目录,你可以说

git rm -r --cached build

当然,如果该文件仍然存在于其他 "current" 提交中(即在其他分支上),那么它仍然会存在(并且可以通过合并的方式潜入您当前的分支)。

如果您从来没有打算让文件存在并且可以忍受历史记录重写,您可以考虑使用 BFG Repo Cleaner 来完全删除它;但这是一个极端的解决方案,它会更改提交 ID 并要求任何协作者替换他们的存储库。

顺便说一句,基本上没有理由将 .gitignore 本身放在 .gitignore 文件中。通常你希望忽略作为回购的一部分共享的规则,但如果你不这样做,你可以使用 .git/info/exclude 而不是 .gitignore.

对于基于路径的排除和基于扩展名的排除,您也不需要单独的条目,除非具有给定扩展名的文件存在于给定路径之外。

将目录添加到 .gitignore:

echo 'node_modules/' >> .gitignore

将文件添加到 .gitignore:

echo 'config/constants.js' >> .gitignore

然后:

git rm -r --cached node_modules/   

或:

git rm -r --cached config/constants.js

添加您的其他文件:

git add .

或:

git add --all

提交:

git commit -m ".gitignore is now working"

最终将您的代码推送到存储库中。