删除由git创build的大型.pack文件
我检查了一个文件的负载分支和合并,然后不得不删除它们,现在我剩下一个大的.pack文件,我不知道如何摆脱。
我使用git rm -rf xxxxxx
删除了所有文件,而且我也运行了--cached
选项。
有人可以告诉我如何删除当前位于以下目录中的大型.pack文件:
.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack
我只需要删除我仍然有但不再使用的分支? 还是有什么我需要运行?
我不知道它有多大的差异,但它显示了对该文件的挂锁。
谢谢
编辑
这里是我的bash_history的一些摘录,应该给我一个想法如何设法进入这个状态(假设在这一点上我正在一个名为“我的分支”的git分支,我有一个文件夹包含更多的文件夹/文件):
git add . git commit -m "Adding my branch changes to master" git checkout master git merge my-branch git rm -rf unwanted_folder/ rm -rf unwanted_folder/ (not sure why I ran this as well but I did)
我以为我也跑了以下,但它并没有出现在与其他人的bash_history:
git rm -rf --cached unwanted_folder/
我也想过我运行了一些git命令(比如git gc
)来清理pack文件,但是它们也不会出现在.bash_history文件中。
问题是,即使你删除了这些文件,它们仍然存在于以前的版本中。 这就是git的一个重点,就是即使你删除了一些东西,你仍然可以通过访问历史来获取它。
你要做的就是重写历史,它涉及到git filter-branch
命令。
GitHub在他们的网站上对这个问题有很好的解释。 https://help.github.com/articles/remove-sensitive-data
要更直接地回答你的问题,你基本上需要运行的是这样的:
git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch unwanted_folder' --prune-empty
这将删除所有对回购历史文件的引用。
接下来,你会想要运行这个,实际上是从包文件中删除文件。
git gc --aggressive --prune
schemeA :如果只将大文件添加到分支,则不需要运行git filter-branch
。 你只需要删除分支并运行垃圾收集:
git branch -D mybranch git reflog expire --expire-unreachable=all --all git gc --prune=all
场景B :但是,它看起来像基于你的bash历史,你确实把变化合并到主。 如果你没有与任何人分享改变(没有git push
)。 最简单的事情是将主人重新设置为与具有大文件的分支合并之前。 这将消除你的分支的所有提交以及合并之后所有提交到主的提交。 因此,除了大文件之外,您可能会失去实际上想要的更改:
git checkout master git log # Find the commit hash just before the merge git reset --hard <commit hash>
然后运行场景A中的步骤。
schemeC :如果分支有其他更改或合并后您想要保留的更改,最好重新绑定主控并有select地包含所需的提交:
git checkout master git log # Find the commit hash just before the merge git rebase -i <commit hash>
在您的编辑器中,删除与添加大文件的提交相对应的行,但保持原样。 保存并退出。 你的主分支应该只包含你想要的,没有大文件。 请注意,没有-p
git rebase
将消除合并提交,所以在<commit hash>
之后,您将留下master的线性历史logging。 这对你来说可能是好的,但是如果不行,你可以试试-p
,但是git help rebase
说明了combining -p with the -i option explicitly is generally not a good idea unless you know what you are doing
。
然后运行场景A中的命令
一个选项:
手动运行git gc
将一些包文件压缩成一个或几个包文件。 这个操作是持久的(即大的包文件将保持其压缩行为),所以定期用git gc --aggressive
另一个select是将代码和.git保存到某处,然后删除.git,然后使用这个已有的代码重新开始,创build一个新的git仓库( git init
)。