设为首页 收藏本站
查看: 580|回复: 0

[经验分享] Git如何永久删除文件(包括历史记录)

[复制链接]

尚未签到

发表于 2018-9-18 08:43:19 | 显示全部楼层 |阅读模式
  http://www.cnblogs.com/shines77/p/3460274.html
  有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的),
  而且上传的文件又特别大的时候, 这将导致别人clone你的代码或下载zip包的时候也必须更新或下载这些无用的文件,
  因此, 我们需要一个方法, 永久的删除这些文件(包括该文件的历史记录).
  首先, 可以参考 github 的帮助:
  https://help.github.com/articles/remove-sensitive-data
步骤一: 从你的资料库中清除文件
  以Windows下为例(Linux类似), 打开项目的Git Bash,使用命令:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path-to-your-remove-file' --prune-empty --tag-name-filter cat -- --all  其中, path-to-your-remove-file 就是你要删除的文件的相对路径(相对于git仓库的跟目录), 替换成你要删除的文件即可.
  如果你要删除的文件很多, 可以写进一个.sh文件批量执行, 如果文件或路径里有中文, 由于MinGW或CygWin对中文路径设置比较麻烦, 你可以使用通配符*号, 例如: sound/music_*.mp3, 这样就把sound目录下以music_开头的mp3文件都删除了.
  例如这样, del-music-mp3.sh:
#!/bin/bash  

  
# git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch projects/Moon.mp3' --prune-empty --tag-name-filter cat -- --all
  
# git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch sound/Music_*.mp3' --prune-empty --tag-name-filter cat -- --all

  如果你看到类似下面这样的, 就说明删除成功了:
Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266)  
# Ref 'refs/heads/master' was rewritten
  如果显示 xxxxx unchanged, 说明repo里没有找到该文件, 请检查路径和文件名是否正确.
  注意: 补充一点, 如果你想以后也不会再上传这个文件或文件夹, 请把这个文件或文件夹添加到.gitignore文件里, 然后再push你的repo.
步骤二: 推送我们修改后的repo
  以强制覆盖的方式推送你的repo, 命令如下:
git push origin master --force  这个过程其实是重新上传我们的repo, 比较耗时, 虽然跟删掉重新建一个repo有些类似, 但是好处是保留了原有的更新记录, 所以还是有些不同的. 如果你实在不在意这些更新记录, 也可以删掉重建, 两者也差不太多, 也许后者还更直观些.
  执行结果类似下面:

Counting objects: 4669, done.  
Delta compression using up to 4 threads.
  
Compressing objects: 100% (4352/4352), done.
  
Writing objects: 100% (4666/4666), 35.16 MiB | 51 KiB/s, done.
  
Total 4666 (delta 1361), reused 0 (delta 0)
  
To https://github.com/defunkt/github-gem.git
  + beb839d...81f21f3 master -> master (forced update)
步骤三: 清理和回收空间
  虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间.
  命令如下:
rm -rf .git/refs/original/  

  
git reflog expire --expire=now --all
  

  
git gc --prune=now
Counting objects: 2437, done.# Delta compression using up to 4 threads.# Compressing objects: 100% (1378/1378), done.# Writing objects: 100% (2437/2437), done.# Total 2437 (delta 1461), reused 1802 (delta 1048)git gc --aggressive --prune=nowCounting objects: 2437, done.# Delta compression using up to 4 threads.# Compressing objects: 100% (2426/2426), done.# Writing objects: 100% (2437/2437), done.# Total 2437 (delta 1483), reused 0 (delta 0)

  注: 绿色字部分是命令执行后的结果.
  现在你再看看你的.git目录文件大小是不是变小了.
  参考自:
  http://whoop.sinaapp.com/blog/article/21
  http://blog.csdn.net/meteor1113/article/details/4407209



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-589510-1-1.html 上篇帖子: 解决git的这个错误:fatal: Unable to find remote helper for 'https' 下篇帖子: git小技巧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表