.gitignore没有正确忽略文件

时间:2017-09-01 14:04:31

标签: git unix cmake gitignore

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

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

我的build/文件夹是我使用CMake的地方,因此有CMakeCache.txtCMakeLists.txt等各种文件,我希望git忽略这些文件。

我的.gitignore文件有:

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

当我运行git status时,modified: CMakeLists.txt我不明白。为什么CMakeLists.txt不被忽略?为什么它是唯一不被忽视的文件?

3 个答案:

答案 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中。