【Git】 如何真正的删除文件

327 阅读2分钟

Git如何真正的删除文件

在使用git进行提交时,可能会误传了一些不需要上传的文件或者敏感文件,比如密码文件、与项目无关的文件等,即使通过git rm [filename]提交一个删除这些文件的合并,也只是删除当前版本中的文件,历史版本它们是仍然存在的,这无疑会造成一些安全隐患。因此,有必要在git上对这些文件进行永久的删除。

操作命令

  • git永久删除文件命令
git filter-branch --force --index-filter 'git \
rm --cached --ignore-unmatch [filename]' \
--prune-empty --tag-name-filter cat -- --all

# 参数说明
filter-branch: 让git重写每一个分支
--force: 假如遇到冲突也让git强制执行
--index-filter: 指定重写的时候应该执行什么命令,要执行的命令紧跟在它的后面`git rm --cached --ignore-unmatch [filename]`
--ignore-unmatch: 要删除的文件名让git删除掉缓存的文件,如果有匹配的话
--prune-empty: 选项告诉git,如果因为重写导致某些commit变成了空(比如修改的文件全部被删除),那么忽略掉这个commit
--tag-name-filter: 表示对每一个tag如何重命名,重命名的命令紧跟在后面,用cat就表示保持tag名不变
--: 表示分割符
--all: 表示对所有的文件都考虑在内

示例

  • 比如要永久删除git仓库中的password.txt文件,执行命令:
git filter-branch --force --index-filter 'git \
rm --cached --ignore-unmatch password.txt' \
--prune-empty --tag-name-filter cat -- --all

由于该命令是去遍历项目的git tree,从每一个节点中去搜索要删除的文件,如果代码仓库比较到,删除的过程可能会很漫长。
执行完成后会发现,本地项目文件夹下的.git文件夹的大小并没有变化,这是因为该命令实际上影响的是仓库里的数据。

  • 如果文件已经提交到远端仓库,则需要删除远端仓库里的文件,执行命令:
git push --all --force

预防措施

可以将不需要上传的文件或者后缀名添加到.gitignore文件中,这样可以直接屏蔽这些文件被误上传,减少安全隐患。