《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
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 《Git/Gitlab进阶》十四:如何把文件真正的从Git里删除