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

本文介绍了在Git中取消文件监听的三种方法:assume-unchanged、skip-worktree和.git/info/exclude。建议使用skip-worktree以防止在pull时覆盖本地更改。同时,讲解了全局.gitignore_global的配置以及在切换分支时遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

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

原因很简单,比如平时自己写一个对项目打补丁、更改的脚本等,
然后我并不希望将这些脚本推到仓库去,最常见的手段是修改项目的 .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

解释

  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 不知道切换下一个分支时,到底是选择忽略还是监听。

完!

参考资料

https://stackoverflow.com/questions/4308610/how-to-ignore-certain-files-in-git

https://stackoverflow.com/questions/13630849/git-difference-between-assume-unchanged-and-skip-worktree

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cookcyq

请作者喝杯暖暖的奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值