问题:

现在项目的根目录放了 .gitignore 文件,并且git远程仓库的项目根目录已经有了 logs文件夹。

由于每次本地运行项目,都会生成新的log文件,但是我并不想提交logs文件夹里面的内容,所以要在.gitignore写logs的规则。

我尝试过添加以下规则
logs/*.log
logs/
/logs/

但是运行git status的时候,始终能看到modified:logs/xx.log

解答:

正确的做法应该是:git rm --cached logs/xx.log,然后更新 .gitignore 忽略掉目标文件,最后 git commit -m "We really don't want Git to track this anymore!"

具体的原因如下:

被采纳的答案虽然能达到(暂时的)目的,但并非最正确的做法,这样做是误解了 git update-index 的含义,而且这样做带来的最直接(不良)后果是这样的:

  1. 所有的团队成员都必须对目标文件执行:git update-index --assume-unchanged <PATH>。这是因为即使你让 Git 假装看不见目标文件的改变,但文件本身还是在 Git 的历史记录里的,所以团队的每个人在 fetch 的时候都会拉到目标文件的变更。(但实际上目标文件是根本不想被 Git 记录的,而不是假装看不见它发生了改变)

  2. 一旦有人改变目标文件之后没有 git update-index --assume-unchanged <PATH> 就直接 push 了,那么接下来所有拉取了最新代码的成员必须重新执行 update-index,否则 Git 又会开始记录目标文件的变化。这一点实际上很常见的,比如说某成员换了机器或者硬盘,重新 clone 了一份代码库,由于目标文件还在 Git 的历史记录里,所以他/她很可能会忘记 update-index。

为什么会这样?答案就在 Git 的 man pages 里:

首先,git update-index 的定义是:

Register file contents in the working tree to the index(把工作区下的文件内容注册到索引区)

这句话暗含的意思是:update-index 针对的是 Git 数据库里被记录的文件,而不是那些需要忽略的文件。

接着看关于 --assume-unchanged 的几句相关的描述:

When the "assume unchanged" bit is on, Git stops checking the working tree files for possible modifications, so you need to manually unset the bit to tell Git when you change the working tree file. This is sometimes helpful when working with a big project on a filesystem that has very slow lstat(2) system call (e.g. cifs).

大致意思是:

应用了该标识之后,Git 停止查看工作区文件可能发生的改变,所以你必须 手动 重置该标识以便 Git 知道你想要恢复对文件改变的追踪。当你工作在一个大型项目中,这在文件系统的 lstat 系统调用非常迟钝的时候会很有用。

我们知道 Git 不仅仅是用来做代码版本管理的,很多其他领域的项目也会使用 Git。比如说我公司曾经一个客户的项目涉及到精密零件图纸文档的版本管理,他们也用 Git。有一种使用场景是对一些体积庞大的文件进行修改,但是每一次保存 Git 都要计算文件的变化并更新工作区,这在硬盘慢的时候延迟卡顿非常明显。

git update-index --assume-unchanged 的真正用法是这样的:

  1. 你正在修改一个巨大的文件,你先对其 git update-index --assume-unchanged,这样 Git 暂时不会理睬你对文件做的修改;
  2. 当你的工作告一段落决定可以提交的时候,重置改标识:git update-index --no-assume-unchanged,于是 Git 只需要做一次更新,这是完全可以接受的了;
  3. 提交+推送。

另外,根据文档的进一步描述:

This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what .gitignore does for untracked files).

这段描述告诉我们两个事实:

  1. 虽然可以用其来达成楼主想要的结果,但这是不讲究的做法(coarse);
  2. 同样的事情更应该用 .gitignore 文件来实现(针对未追踪的文件)。

随之而来的问题是:为什么我增加了 .gitignore 里的规则却没有效果?

这是因为我们误解了 .gitignore 文件的用途,该文件只能作用于 Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)。

之所以你的规则不生效,是因为那些 .log 文件曾经被 Git 记录过,因此 .gitignore 对它们完全无效。这也正是开头那段简短答案所做的事情:

  1. 从 Git 的数据库中删除对于该文件的追踪;
  2. 把对应的规则写入 .gitignore,让忽略真正生效;
  3. 提交+推送。

只有这样做,所有的团队成员才会保持一致而不会有后遗症,也只有这样做,其他的团队成员根本不需要做额外的工作来维持对一个文件的改变忽略。

最后有一点需要注意的,git rm --cached 删除的是追踪状态,而不是物理文件;如果你真的是彻底不想要了,你也可以直接rm+忽略+提交。

git忽略已被跟踪的文件相关推荐

  1. git忽略已加入版本控制的文件

    1.删除本地git缓存 git rm -r --cached 文件名 2.将忽略文件加入到.gitignore

  2. Git忽略已经被提交的文件

    为了避免麻烦,最好是一开始就设定好.gitignore文件,避免误提交了这些无用的文件.但是并不是所有情况都能在最开始就考虑周全的.因为.gitignore只能忽略掉那些原来没有被track的文件,如 ...

  3. 如何从当前Git工作树中删除本地(未跟踪)文件

    如何从当前工作树中删除未跟踪的本地文件? #1楼 如果未跟踪的目录是它自己的git存储库(例如,子模块),则需要使用-f两次: git clean -d -f -f #2楼 如果需要从特定子目录中删除 ...

  4. Git - .gitignore怎么忽略已经被版本控制的文件

    问题 如果某个文件已经存在于远程仓库了,也就是说某个文件已经被版本控制了,如果将该文件添加到.gitignore中,是无法生效的.因为.gitignore是用来控制尚未被纳入版本控制的文件,如果文件已 ...

  5. .gitignore文件_Java小白入门,Git忽略文件.gitignore详解

    在工程中,并不是所有文件都需要保存到版本库中的,例如"target"目录及目录下的文件就可以忽略.在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件 ...

  6. 添加git 忽略文件

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交. Git 忽略文件提交的方法 有三种方法可以实现忽略Gi ...

  7. Git忽略文件.gitignore详解

    文章目录 Git 忽略规则优先级 Git 忽略规则匹配语法 常用匹配示例 .gitignore规则不生效 Java项目中常用的.gitignore文件 在工程中,并不是所有文件都需要保存到版本库中的, ...

  8. Git忽略文件.gitignore规则详解

    在工程中,并不是所有文件都需要保存到版本库中的,例如"target"目录及目录下的文件就可以忽略.在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件 ...

  9. [转]Git忽略提交规则 - .gitignore配置运维总结

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交.简单来说一个场景:在你使用git add .的时候,遇到 ...

最新文章

  1. 三、开发调试应用程序
  2. 初入R语言,绘制heatmap图
  3. boost::locale::calendar用法的测试程序
  4. 搭载「光线追踪」技术的次时代主机会有怎样的画面表现?
  5. Qt工作笔记-使用Qt中QProcess与iostream中system调用外部进程
  6. 201671010119 2016-2017-2《Java程序设计》第十四周学习心得
  7. 王琪你计算机学院,计算机学院“计忆时光”2019元旦联欢会暨年度颁奖典礼圆满举行...
  8. python中while的用法_Python—while循环,内涵五种九九乘法表
  9. c语言解数独算法递归,How to think:递归和数独试探算法
  10. 教大家多个域名绑定一个空间的解决办法,原创,自己已经测试过了,完全可以绕过杀毒软件,以及空间商.
  11. dao-service-servlet-jsp构建简易web通讯录(三层开发)bug1
  12. 2021 年软件开发趋势方向
  13. Java编程:马踏棋盘算法(骑士周游问题)
  14. c语言代码行数统计标准,Shell脚本实现C语言代码行数统计
  15. 黑苹果声卡id注入对照表_声卡,给苦苦做AppleALC的新人一个提示,试着先原版AppleALC.kext,注入ID驱动试试...
  16. 非负矩阵分解 java_matlab练习程序(非负矩阵分解)
  17. 2022-2028全球与中国商用车辆HMI解决方案市场现状及未来发展趋势
  18. win10 不能查看其它电脑共享文件夹常用解决方法
  19. 加入域时出现“不能访问网络位置”错误信息
  20. Unity脚本(三)

热门文章

  1. 阿里AI天池大赛-资金流入流出预测-基于周期因子的时间序列预测
  2. python执行sql查询脚本并填写到excel_用Python执行SQL、Excel常见任务?10个方法全搞定!...
  3. 硬件 - 数字电路 - 使用反向门、与门、或门搭建二选一的多路选择器
  4. PMP考试常用缩写和公式(下)
  5. Ubuntu 16.04 + Nvidia 显卡驱动 + Cuda 8.0 (问题总结 + 解决方案)
  6. 贴片电阻的识别与作用
  7. C语言(输入输出函数getchar,putchar、gets、puts,scanf,printf的功能以及用法)
  8. 关于memory.dmp文件
  9. SQL注入--入侵动网
  10. iphone12锁屏密码忘记了怎么办 (苹果12如何找回密码)