Git 永久删除文件
来源:互联网 发布:学霸通软件下载 编辑:程序博客网 时间:2024/06/10 03:49
简略版
假设要删除的文件是password.txt,运行如下命令:
git filter-branch --force --index-filter 'git \rm --cached --ignore-unmatch password.txt' \--prune-empty --tag-name-filter cat -- --all
如果commit已经同步到了github,那么再运行如下命令永久删除远端上的文件。
git push --all --force
不用关心各条命令在干什么,大功告成!
详细版
你如果有耐心或者有兴趣知道上面两条命令是如何工作的,就接着往下读。。。
问题的产生
众所周知,git是用来进行版本控制的,可以恢复到任何commit了的历史状态,对于新手来说,经常会把一些不必要的数据或者敏感数据放到github的公开项目中。比如说我,刚接触git时,每次修改之后都用 git add .
图省事,结果一些.class, .zip, .exe文件都被commit了,很烦人。要是不小心提交了密码或者机器的SSH key,就容易产生安全隐患。
一个简单但错误的办法就是使用git rm password.txt
命令删除敏感文件,但是这仅仅是把文件从当前版本中删除,历史版本中仍然有。
下面来说说正确命令的每个选项是什么意思:
git filter-branch --force --index-filter 'git \rm --cached --ignore-unmatch password.txt' \--prune-empty --tag-name-filter cat -- --all
filter-branch
是让git重写每一个分支, --force
假如遇到冲突也让git强制执行, --index-filter
选项指定重写的时候应该执行什么命令,要执行的命令紧跟在它的后面,在这里就是git rm --cached --ignore-unmatch password.txt
,让git删除掉缓存的文件,如果有匹配的话。
--prune-empty
选项告诉git,如果因为重写导致某些commit变成了空(比如修改的文件全部被删除),那么忽略掉这个commit。
--tag-name-filter
表示对每一个tag如何重命名,重命名的命令紧跟在后面,当前的tag名会从标注输入送给后面的命令,用cat就表示保持tag名不变。
紧跟着的--
表示分割符,最后的--all
表示对所有的文件都考虑在内。
预防措施
今后为了防止再次不小心将敏感数据提交,可以修改.gitignore文件的内容,凡是成功匹配的文件都不会被git看到,比如在本例中可以在.gitignore后面追加一行”password.txt”
参考资料:
1.stackoverflow上的一个讨论: http://stackoverflow.com/questions/2004024/how-to-permanently-delete-a-file-stored-in-git
2.github官方的指南:https://help.github.com/articles/remove-sensitive-data/
3.关于git filter-branch使用的文档:https://git-scm.com/docs/git-filter-branch
- git永久删除文件
- git永久删除文件
- Git 永久删除文件
- Git如何永久删除文件(包括历史记录)
- Git永久删除文件(包括历史记录)
- Git永久删除commit
- 从git中永久删除文件以节省空间
- 从git中永久删除文件以节省空间
- 改写历史,永久删除git库的物理文件
- 永久删除git库中的所有大文件或者机密文件
- 如何永久删除git仓库中敏感文件的提交记录
- 永久删除文件文件如何寻回
- 永久删除的文件怎么恢复
- 怎么找到由于文件永久删除的文件
- Git 删除文件
- Git-删除文件
- git恢复删除文件
- Git教程:删除文件
- Android设计模式系列--原型模式
- Deep Learning(深度学习)
- DC02-PE32 【题目】已知k阶斐波那契序列的定义为:
- Android设计模式系列--观察者模式
- 双关键字快排
- Git 永久删除文件
- Android设计模式系列--模板方法模式
- PLSQL number类型显示为科学记数法
- Android 状态栏透明
- params 关键字
- LINK : fatal error LNK1123: 转换到 COFF 期间失败
- Unity3D--协同程序(Coroutine)
- 素数线性筛模板与证明
- Linux下mysql的root密码忘记解决方法