git中如何忽略已经提交的文件

问题

在初始化git仓库的时候没有创建.gitignore文件来过滤不必要提交的文件, 后来却发现某些文件不需要提交, 但是这些文件已经被提交了, 这时候创建.gitignore文件忽略这些文件时, 发现ignore的规则对那些已经被track的文件无效[1].

其实.gitignore文件只会忽略那些没有被跟踪的文件, 也就是说ignore规则只对那些在规则建立之后被新创建的新文件生效. 因此推荐: 初始化git项目时就创建.gitignore文件.

那么如何使.gitignore文件的规则对于那些已经被track的文件生效呢 ?

解决方法

你可以参考一下关于此问题的相关讨论==>点这里

这个讨论里面也给出了真正的解决方法[2], 那就是:

1、在.gitignore文件中添加忽略规则

  • .gitignore文件中添加ignore条目, 如: some/path/some-file.ext
  • 提交.gitignore文件: git commit -a -m "添加ignore规则"

2、备份需要添加至ignore规则的文件(根据个人需求选择是否备份)

3、删除track的文件(已经commit的文件)后,进行一次提交

  • git rm -rf 要忽略的文件或文件夹rm -rf 要忽略的文件或文件夹
  • git commit -a -m "删除不需要的文件" -> 若前面使用git rm,此处可直接git commit -m "删除不需要的文件"tip1

4、将备份的文件拉回原路径,然后运行git status命令,确认ignore规则生效 tip2

5、推送到远程仓库是ignore规则对于其他开发者也能生效: git push [remote]

总结

最好创建git仓库的同时创建.gitignore文件, 并且把忽略规则写好(尽量考虑到所有应该略的文件, 这样就可以避免出现上面的文件啦)

注释

tip1: -r加上后才可删除文件夹

tip2: git rm对比rm命令

  • git rm等价于rm + git add[3]
  • git rm提供了仓库中操作时的备份功能如:
    • git rm -f 效果同于rm -f + git add
    • git rm --cached 命令中,--cached的效果等同于解决方法 中第2,以及第4个步骤效果结合的备份作用(当然,还带有git add的效果),即文件脱离track的同时,实际文件并没有真的删除。而rm命令无此功能项。
    • 因此,若不想删除实际文件(需要备份),则直接使用git rm --cached命令,可以免去此过程中用rm命令前必须的手动备份操作。

参考

[1] git如何忽略已经提交的文件 (.gitignore文件无效)

[2] git忽略已经被提交的文件

[3] rm 和 git rm 的区别