使 git 不再跟踪某一个文件

更新日期: 2016-11-04 阅读次数: 11999 分类: Git

例如,配置文件需要从 git 仓库中剔除,但是又需要本地保留。

危险的做法,强烈不推荐 (未成年人请在家长陪同下尝试)

git rm --cached config.php

即 

git rm --cached <file>

在一个分支下开发,这种做法是没有问题的。即,如果在 master 分支里,使用如上操作之后,config.php 就从 git 管理中剔除了,但是仍然存在于硬盘上。并不会影响到本地开发环境的正常调试。

但是,但是,但是。。。如果同时满足以下条件的情况下,你就准备哭吧

  • 多分支同时存在 config.php 文件。例如,master 分支,dev 分支都有 config.php 文件
  • 一个分支删除了该文件,然后在另一个分支,merge 了该提交

这时,你运行一下 ls,“pong... 世界末日到了”, 你会发现,TMD config.php 文件彻底消失了,master 分支,dev 分支中的该文件都消失了,永远的从磁盘上消失了。你妹啊!!!

人与人之间最起码的信任在哪里???

对于配置文件,正确的姿势

合理的做法是,参考 laravel 的项目管理方式

  1. 复制 config.php 到 config.php.bak
  2. 将 config.php.bak 加入到 git 管理
  3. git rm --cached config.php
  4. 将 config.php 加入到 .gitignore 中
  5. 到不同的环境中,发现 config.php 缺失,就 copy 一份 config.php.bak 即可

git update-index --assume-unchanged

亮教授提到的 git update-index --assume-unchanged,他的作用是

When the "assume unchanged" bit is on, the user promises not to change the file and allows Git to assume that the working tree file matches what is recorded in the index. If you want to change the working tree file, you need to unset the bit to tell Git.

看上去并不是我想要的,至少不是用来跟踪配置文件的正确方法。其适用的场合我暂时想不出来,唯一想到的是,我担心团队中其他人修改我的代码,就加上这个配置,但是这有点太屌了,感觉会被殴打。

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式