本文主要介绍如何在git中删除文件但是让git不追踪这些删除操作
场景说明
自己在使用react
开发一个包含大量媒体文件的网站时,项目初期临时将这些媒体文件都放在项目中,直接使用访问本地文件的方式读入媒体文件。
这样做会导致因为项目中包含大量媒体文件,本地开发时React Hot Loader
在compiling
的时候速度会非常慢,严重影响修改代码后在浏览器查看页面效果的效率。
但对于生产环境Build
时,影响不大。所以考虑在将文件同步到代码仓库后,本地删除这些媒体文件,但是删除的操作不能让git
同步到代码仓库,否则会导致生产环境pull
下来的仓库里也没有媒体文件,影响业务使用。
所以解决问题的重点在于: 如何删除本地已经提交过的目录下的文件,但是让git不追踪这些删除操作(即,不显示在git的changes里面)
解决方案
gitignore
可以ignore
掉还没进到项目里的文件,或者是非删除操作的change,但是对于删除一个已经在git repo的文件,.gitignore
不起作用。
关于git
删除文件或者停止追踪文件的方法,可以有:
- Ignore changes to untracked files by using a
.gitignore
file - Ignore changes to untracked files by using an
exclude
file - Stop tracking a file and ignore changes using
git update-index
- Stop tracking a file and ignore changes using
git rm
更多具体内容可以参考文档
删除一个文件
git
自带的命令中可以使用git update-index --skip-worktree <file path>
来ignore
掉指定的文件,执行命令之后再删除文件,git
的changes中也不会列出这个文件被删除的change。
删除一个文件夹以及子文件夹
因为git update-index --skip-worktree
是针对一个文件,所以对于一个文件夹下的文件和子文件夹的全部文件,就得需要配合其他linux
命令来达成,如下:
- 进入到要删除的文件夹:
cd /path/to/folder/want/to/delete
- 通过命令将文件夹下的全部文件都作为输入传到
git update-index --skip-worktree
命令:find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && pwd && git ls-files -z ${pwd} | xargs -0 git update-index --skip-worktree" \;
- 之后删除掉这个文件夹即可,
git
不会追踪这些删除
写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~👇