前言:为什么需要取消文件监听?
原因很简单,比如平时自己写一个对项目打补丁、更改的脚本等,
然后我并不希望将这些脚本推到仓库去,最常见的手段是修改项目的 .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
更稳妥些。
第二种:在本项目的 .git\info\exclude 文件配置
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 不知道切换下一个分支时,到底是选择忽略还是监听。
完!
参考资料
https://stackoverflow.com/questions/4308610/how-to-ignore-certain-files-in-git