.gitignore 没有正确忽略文件
.gitignore not ignoring a file properly
我有一个项目,其结构如下:
build/
.git/
.gitignore
LICENSE
pics/
project.c
README.md
shared/
solutions/
我的 build/
文件夹是我使用 CMake 的地方,所以有各种文件,如 CMakeCache.txt
、CMakeLists.txt
等,我希望 git 忽略它们。
我的 .gitignore
文件有:
.gitignore
*.out
*.swp
/build/*
当我 运行 git status
有 modified: 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"
最终将您的代码推送到存储库中。
我有一个项目,其结构如下:
build/
.git/
.gitignore
LICENSE
pics/
project.c
README.md
shared/
solutions/
我的 build/
文件夹是我使用 CMake 的地方,所以有各种文件,如 CMakeCache.txt
、CMakeLists.txt
等,我希望 git 忽略它们。
我的 .gitignore
文件有:
.gitignore
*.out
*.swp
/build/*
当我 运行 git status
有 modified: 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"
最终将您的代码推送到存储库中。