《Git/Gitlab进阶》十四:如何把文件真正的从Git里删除

本章主要测试讲解

  • 利用git filter-branch命令,彻底删除已提交文件。

测试过程内容较多,每个步骤都逐一截图以便真实说明,也有列示用法。若不感兴趣,可直接查看总结部分。

测试过程

前置说明

例如在开发过程中,把私用账号密码文件提交了,或者其它机密文件提交了,那么在 git 中就会保留那份文件,如果 push 到远程,那么其它人也有可能看到这份他们可能不应该看到的文件,所以,如何把这份文件从 git 中移除掉?

大概流程:

  • 1、新建一个项目 test-filter-branch,git 初始化,并放入两个文件,初始化提交
  • 2、模拟误操作添加了不应该提交的 password.txt 文件,并提交
  • 3、误提交 password.txt 之后,模拟又多次提交
  • 4、将每个提交中的 password.txt 移除,并清理垃圾回收中的相关设定

测试步骤

新建一个在 test-filter-branch 项目并初次提交

1.png

之后,在项目中创建了一个 config,里面有个 password.txt 文件。
假设属于私有机密文件,不应该被提交,但是又忘记在创建前加入.gitignore 文件。且已经提交了。

2.png

密码提交之后,又进行了很多次提交。

3.png

突然想起密码被提交,需要从 commit 中,把文件删除,此时 commit 记录如下

4.png

使用以下命名:

git filter-branch -f --tree-filter "rm -f config/password.txt"
5.png

此时,config/password.txt 文件是不见了

6.png

即便如此,还是可以通过 git reset 指令找回来。
所以,还有几个跟资源回收有关的事情需要处理一下
删除备份点:rm .git/refs/original/refs/heads/master
设置 reflog 立即过期:git reflog expire --all --expire=now

7.png

此时再查看 git reflog 会发现没有记录,使用 git fsck 指令就可以看到很多 Unreachable 的对象了

8.png

不过,查看日志还能看到提交秘密时的 commit id,使用 git reset 能恢复 password.txt 文件吗,试一下。

查看日志(注意,删除后 commit 日志和删除之前的,有涉及到 password.txt 的 commit id 全都变了。)

9.png

使用 git reset 之后,可以看到已然没有 config/password.txt 文件了。

10.png

注意:删除 commit 中 password.txt 文件,在本地已经完成了,如果在之前已经推送到了远程,则需要使用git push -f覆盖掉。

总结

删除文件步骤主要使用命令:

git filter-branch -f --tree-filter "rm -f config/password.txt" # 重写分支
rm .git/refs/original/refs/heads/master # 删除备份点
git reflog expire --all --expire=now # 设置reflog立即过期
git push -f # 同步远程

特别说明: 重写的历史将具有所有对象的不同对象名称,并且不会与原始分支会聚。您将无法在原始分支的顶部轻松推送和分发重写的分支。如果您不知道完整的含义,请不要使用此命令,并且无论如何都要避免使用它。

11.png

此外 git 官网git-filter-branch WARNING也不建议使用此命令:

https://linux.die.net/man/1/git-filter-branch

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第一部分是文档,为了日后查看方便放到了前边[可能敲错了,详见阮一峰老师的文章]http://www.ruanyif...
    白璞1024阅读 1,131评论 0 49
  • 1. GIT命令 git init在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个re...
    江边一蓑烟阅读 887评论 0 0
  • 查看、添加、提交、删除、找回,重置修改文件 git help # 显示command的help git sho...
    Swiftor阅读 2,197评论 0 2
  • 前言 Git使用教程 Git是什么 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 ...
    90后的思维阅读 1,020评论 0 0
  • 输入 y ,创建 git_hug 目录No githug directory found, do you wish...
    风花花阅读 2,098评论 0 4

友情链接更多精彩内容