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
解释
- 切换到用户目录
- 新建 .gitignore_global 文件
- 全局配置
.gitignore_global 通常放在 C:Users用户名 下面 .gitignore_global 编辑规则和上面一样
node_modules/ dist/ test/ config/index.js
这样每个项目都会生效这套规则。
注意事项
选择以上任意一种方式都会有特殊情况:比如对当前项目 index.js 取消跟踪,当切换分支时,如果切换分支的(index.js)与本项目的index.js有冲突,那么是无法切换过去的,会提示如下: 图中表示 “config/index.js 会被即将到来的分支所覆盖,请在切换分支前进行提交”,这个问题花了我很多时间去寻找答案,目前能找到的唯一手段是
- 恢复监听、
- 使用 stash 保留数据 然后切换分支
- stash pop 恢复数据
- 重新取消监听
命令如下
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 不知道切换下一个分支时,到底是选择忽略还是监听。
完!
参考资料
下一篇:
python基础——列表切片操作