删除由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 )。