我想从 git 存储库的历史记录中删除一个目录及其内容,以减小此 git 存储库的大小。(该目录包含二进制资产,例如模型和纹理,并且迄今为止对 git 存储库的大小贡献最大。)
git filter-branch --tree-filter 'rm -rf the_directory' --prune-empty HEAD
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
echo the_directory/ >> .gitignore
git add .gitignore
git commit -m 'Removing the_directory from git history'
git gc
git push origin master --force
Run Code Online (Sandbox Code Playgroud)
这似乎有效,因为我在 Github 上的提交历史记录中再也找不到对该目录及其内容的任何引用。(我有超过 1500 次提交,目录总是在那里,但不再存在。我什至找不到我明确删除目录的提交(从存储库但不是从历史记录中)。)
不幸的是,根据 Github,存储库的大小没有改变。我仍然有一个PACK450MB的文件(而实际存储库现在低于 14MB)。
我使用以下git命令来查找最大的文件:
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
git rev-list --objects --all | grep the_id
Run Code Online (Sandbox Code Playgroud)
结论 最大的文件仍然位于我想删除的目录中?
我尝试了各种方法:
但PACK文件几乎保持不变或变得更大(~500MB)。
我怎样才能减少PACK文件的大小,从而减少我的 git 存储库,更具体地说,从PACK文件中删除包含在目录中的文件及其内容?
您可以尝试BFG Repo-Cleaner及其--delete-folders选项:(
在裸克隆的存储库上执行此操作,复制您的存储库以进行测试)
bfg --delete-folders the_directory --delete-files the_directory --no-blob-protection my-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
Run Code Online (Sandbox Code Playgroud)
默认情况下,这将更新您的提交以及所有分支和标签。
| 归档时间: |
|
| 查看次数: |
409 次 |
| 最近记录: |