我有一个项目,其结构如下:
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
不被忽略?为什么它是唯一不被忽视的文件?
答案 0 :(得分:3)
由于git ls-files --error-unmatch build/CMakeLists.txt
没有向您显示任何错误,这表示您的仓库中已经跟踪了build/CMakeLists.txt
文件,因此.gitignore
文件不再对其产生影响。您需要运行git rm --cached build/CMakeLists.txt
才能从git中删除它。
答案 1 :(得分:0)
忽略规则(如.gitignore
中的规则)仅适用于未跟踪的文件。无法忽略对跟踪文件的更改。人们喜欢为这个用例建议一些机制,但它们都比解决问题更麻烦。
(我们知道有问题的文件已被跟踪,因为git告诉你它已被修改。这意味着该文件的某个版本已存在于索引中。)
如果从索引中删除该文件,则可以应用忽略规则。这意味着从此提交转发中,repo包含文件的 no 版本。如果你想忽略成功覆盖整个build
目录,你可以说
git rm -r --cached build
当然,如果该文件仍然存在于其他“当前”提交中(即在其他分支上),那么它仍然存在(并且可以通过合并的方式潜回到当前分支中)。
如果您从未将文件存在并且可以遵守历史记录重写,您可以考虑使用BFG Repo Cleaner来完全摆脱它;但这是一个极端的解决方案,它将改变提交ID并要求任何协作者替换他们的回购。
顺便说一句,基本上没有理由将.gitignore
本身放在.gitignore
文件中。通常,您希望忽略作为回购的一部分共享的规则,但如果不这样做,则可以使用.git/info/exclude
代替.gitignore
。
除非基于路径的排除和基于扩展的排除,否则您也不需要单独的条目,除非具有给定扩展名的文件存在于给定路径之外。
答案 2 :(得分:-1)
将目录添加到.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"
最后将代码推送到repo中。