南昌网站建设讯息,网站建设公司方维,湘潭网站建设优等磐石网络,大连是谁建设的正确的做法应该是#xff1a;git rm --cached logs/xx.log#xff0c;然后更新 .gitignore 忽略掉目标文件#xff0c;最后 git commit -m We really dont want Git to track this anymore!
具体的原因如下#xff1a;
被采纳的答案虽然能达到#xff08;暂…正确的做法应该是git rm --cached logs/xx.log然后更新 .gitignore 忽略掉目标文件最后 git commit -m We really dont want Git to track this anymore!
具体的原因如下
被采纳的答案虽然能达到暂时的目的但并非最正确的做法这样做是误解了 git update-index 的含义而且这样做带来的最直接不良后果是这样的 所有的团队成员都必须对目标文件执行git update-index --assume-unchanged PATH。这是因为即使你让 Git 假装看不见目标文件的改变但文件本身还是在 Git 的历史记录里的所以团队的每个人在 fetch 的时候都会拉到目标文件的变更。但实际上目标文件是根本不想被 Git 记录的而不是假装看不见它发生了改变 一旦有人改变目标文件之后没有 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 的真正用法是这样的 你正在修改一个巨大的文件你先对其 git update-index --assume-unchanged这样 Git 暂时不会理睬你对文件做的修改 当你的工作告一段落决定可以提交的时候重置改标识git update-index --no-assume-unchanged于是 Git 只需要做一次更新这是完全可以接受的了 提交推送。
另外根据文档的进一步描述 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). 这段描述告诉我们两个事实 虽然可以用其来达成楼主想要的结果但这是不讲究的做法coarse 同样的事情更应该用 .gitignore 文件来实现针对未追踪的文件。
随之而来的问题是为什么我增加了 .gitignore 里的规则却没有效果
这是因为我们误解了 .gitignore 文件的用途该文件只能作用于 Untracked Files也就是那些从来没有被 Git 记录过的文件自添加以后从未 add 及 commit 过的文件。
之所以你的规则不生效是因为那些 .log 文件曾经被 Git 记录过因此 .gitignore 对它们完全无效。这也正是开头那段简短答案所做的事情 从 Git 的数据库中删除对于该文件的追踪 把对应的规则写入 .gitignore让忽略真正生效 提交推送。
只有这样做所有的团队成员才会保持一致而不会有后遗症也只有这样做其他的团队成员根本不需要做额外的工作来维持对一个文件的改变忽略。 最后有一点需要注意的git rm --cached 删除的是追踪状态而不是物理文件如果你真的是彻底不想要了你也可以直接 rm忽略提交。