2017-09-01 130 views
-1

我有一个项目,其结构如下:的.gitignore不忽略一个文件中正确

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

build/文件夹是我使用的CMake所以有各种文件,如CMakeCache.txt,我想混帐CMakeLists.txt等。忽略。

.gitignore文件有:

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

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

+0

'git ls-files --error-unmatch build/CMakeLists.txt'命令的输出是什么? – skovorodkin

+0

输出是'build/CMakeLists.txt' –

+0

[如何从当前Git工作树中删除本地(未跟踪的)文件?](https://stackoverflow.com/questions/61212/how-to-remove - 本地 - 未跟踪档案,来自该电流混帐工作树) – phd

回答

2

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

0

忽略规则(如.gitignore中的规则)仅适用于未跟踪的文件。跟踪文件的变化不能被忽略。人们喜欢为这种用例提出建议,但它们都会造成比解决更多的麻烦。

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

如果从删除文件索引然后忽略规则可以适用。这意味着从此承诺转发,回购包含没有版本的文件。如果你想忽略成功地覆盖整个build目录,你可以说

git rm -r --cached build 

当然,如果在文件中其他的“当前”提交(即在其他部门)仍然存在,那么它仍然会在那里(和可以通过合并的方式潜入您当前的分支)。

如果你从来没有将文件指向那里并且可以遵守历史重写,那么你可以考虑使用BFG Repo Cleaner来完全摆脱它;但这是一个极端的解决方案,它会更改提交ID并要求任何合作者替换其回购。

另外,基本上没有理由将.gitignore本身置于.gitignore文件中。通常情况下,您希望忽略作为回购协议一部分共享的规则,但如果您不这样做,则可以使用.git/info/exclude而不是.gitignore

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

-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" 

最后把你的代码放到回购。