Git 取消 git 文件跟踪/监听的几种方式及注意事项

前言:为什么需要取消文件监听?

原因很简单,比如平时自己写一个对项目打补丁、更改的脚本等, 然后我并不希望将这些脚本推到仓库去,最常见的手段是修改项目的 .gitignore (没有就新建一个) ,然后写上你要忽略的文件规则,如下

node_modules/
config/index.js

不过这里有个问题, .gitignore 的修改会被 git 监听到,本文就是来解决此问题的。

第一种:assume-unchanged 和 skip-worktree

    方法1:使用assume-unchanged
git update-index --assume-unchanged 指定你的文件
// 例如
git update-index --assume-unchanged ./config/index.js
    方法2:使用skip-worktree
git update-index --skip-worktree 指定你的文件
// 例如
git update-index --skip-worktree ./config/index.js

以上选任意一种即可,现在再去修改 ./config/index.js 将不会被 git 追踪到,如果想恢复可以输入对应的命令:

git update-index --no-assume-unchanged 文件名
git update-index --no-skip-worktree 文件名

以下命令可以列出哪些文件被 assume-unchanged || skip-worktree 使用过

window环境
git ls-files -v | findstr /B h 			列出 assume-unchanged
git ls-files -v | findstr /B S  		列出 skip-worktree
linux环境
git ls-files -v|grep "^h"
git ls-files -v|grep "^S"

assume-unchanged 与 skip-worktree 有什么区别

本人觉得大同小异,只是在使用 pull 时有细微差别,比如

    --assume-unchanged 在 pull 时,如果远程文件发生与你的取消监听文件有冲突,git 会以远程文件为最新覆盖掉旧的,这样原先的取消监听文件将会失效。 --skip-worktree 在 pull 时,git 会尽力维护你的取消监听文件,确保它们不会被给覆盖掉,最多就会提示你冲突了,让你手动解决。

结合以上本人建议使用 skip-worktree 更稳妥些。

第二种:在本项目的 .gitinfoexclude 文件配置

exclude 规则同 .gitignore,比如

node_modules/
dist/
test/
config/index.js
注意:exclude 无法取消跟踪现有的文件,只能用第一种方式解决。

第三种:全局配置 .gitignore_global

cd ~
touch .gitignore_global
git config --global core.excludesfile ~/.gitignore_global

解释

  1. 切换到用户目录
  2. 新建 .gitignore_global 文件
  3. 全局配置

.gitignore_global 通常放在 C:Users用户名 下面 .gitignore_global 编辑规则和上面一样

node_modules/
dist/
test/
config/index.js

这样每个项目都会生效这套规则。

注意事项

选择以上任意一种方式都会有特殊情况:比如对当前项目 index.js 取消跟踪,当切换分支时,如果切换分支的(index.js)与本项目的index.js有冲突,那么是无法切换过去的,会提示如下: 图中表示 “config/index.js 会被即将到来的分支所覆盖,请在切换分支前进行提交”,这个问题花了我很多时间去寻找答案,目前能找到的唯一手段是

  1. 恢复监听、
  2. 使用 stash 保留数据 然后切换分支
  3. stash pop 恢复数据
  4. 重新取消监听

命令如下

git update-index --no-skip-worktree ./config/index.js
git stash
git checkout 分支名
git stash pop
git update-index --skip-worktree ./config/index.js

因此笔者建议要取消监听的文件最好是新建的,而不是现有的,这样切换不同分支时就不会出现这样的问题,当然了如果新建的文件跟切换分支的文件相同,也还是会产生上面的情况。

我的建议是减少取消跟踪现有的文件,因为 git 不知道切换下一个分支时,到底是选择忽略还是监听。

完!

参考资料

经验分享 程序员 微信小程序 职场和发展