Open Yikun opened 3 years ago
手动删除某个大文件历史信息方法:
1、根据git big-files: 找出所有的大文件blob。
2、重写commit,删除大文件
使用以下命令,删除历史提交过的大文件:
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch xxx/xxx/' --prune-empty --tag-name-filter cat -- --all
上面脚本中的xxx/xxx/请换成你第一步查出的大文件名,或者这里直接写一个目录。
清理和回收空间
虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间,命令如下:
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
3、推送修改后的repo
以强制覆盖的方式推送你的repo, 命令如下:
git push --force
git remote prune origin
@Lee-robbie Thanks!
本文详细解释了在github及gitee上对大文件处理的限制以及解决方案。
Github和Gitee文件大小限制
简单说,如果gitee通过非LFS方式,上传了100MB以上的文件,那么github无法镜像。gitee通过LFS方式,上传了100MB以上的文件,最大不能超过2GB,且总和不能超过1GB。否则会出现
this exceeds GitHub's file size limit of 100.00 MB
错误:1. 如何处理大文件(超过100MB的文件)
任何方案,都需要处理最近一次commit(通过删除或者LFS改造)和历史所有commits的提交(通过bfg)
第一步:处理当前大文件(最近一次commit)
找到大文件。通过
git big-files
和git blob-find
找到所有出现问题的分支。处理大文件: [推荐] 方案一(删除大文件,并保留历史提交): 通过自动化下载和脚本的方式,此步完成后,所有的大文件在lastest commit都被清除。 方案二(利用LFS改造大文件,并保留历史提交): lfs方式改造大文件。在每个分支通过
git lfs
方式进行改造,此步完成后,所有的大文件在lastest commit都改造为lfs方式。第二步:处理历史大文件(历史所有commits)
清除历史大文件。利用bfg工具,清除所有历史大文件提交记录。(注意:此步会重新提交每个commits,大文件的commit会被替换为xxx.remove的flag文件)
2. 详细解释
2.1 如何找到所有大文件的历史提交及大文件对应的分支?
把下面的配置copy到~/.gitconfig的底部:
git big-files
: 找出所有的大文件blob。可以看到最大的文件的blob hash是
96cf9e58c3e4
,大小是119MiB
,路径为c++/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_VENC/model/yolov3.om
git blob-find
: 找到blob所在提交和分支。可以看到
96cf9e58c3e4
这个blob,在dev分支的4290b1a、59d12cb这两个commits有提交或者修改。2.2 删除大文件。通过lfs方式改造大文件 或者 删除大文件
方案一:删除大文件
方案二:通过lfs方式改造大文件
参考:https://git-lfs.github.com/
2.3 如何清除所有分支历史的大文件
https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/removing-sensitive-data-from-a-repository#using-the-bfg