通过删除创建的git大.pack文件通过删除创建的git大.pack文件(Remove large

2019-06-17 10:04发布

我查文件的加载到一个分支,合并,然后不得不删除他们,现在我只剩下一个大.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 ),试图收拾包文件,但他们没有任何出现在.bash_history的文件。

Answer 1:

问题是,即使你删除的文件,它们仍然存在于以前的版本。 那混帐的整点,就是即使你删除的东西,你仍然可以把它找回来通过访问历史。

你所希望做的是被称为改写历史,它涉及的git filter-branch指令。

GitHub上有问题,在他们的网站一个很好的解释。 https://help.github.com/articles/remove-sensitive-data

为了更直接地回答你的问题,你基本上需要运行的是与此命令unwanted_folename_or_folder相应地改为:

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch unwanted_folename_or_folder' --prune-empty

这将从回购的积极历史记录中删除的文件的所有引用。

接下来,一个[执行GC周期,迫使所有引用文件过期,并从打包文件中清除。 什么都不需要这些命令进行更换。

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --aggressive --prune=now


Answer 2:

一个选项:

运行git gc手动凝结了许多包文件到一个或几个包文件。 此操作是持久性的(即大包文件将保留其压缩行为),所以它可能是有益的与周期性压缩库git gc --aggressive

另一种选择是保存代码和git的地方,然后删除。git的并再次开始使用这个现有的代码,创建一个新的git仓库( git init )。



Answer 3:

方案A:如果你的大文件只添加到分支,你并不需要运行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的步骤

方案C:如果有从分支更改,要保持其他变化对主合并后,这将是最好的重订主并选择性包括承诺要:

git checkout master
git log # Find the commit hash just before the merge
git rebase -i <commit hash>

在你的编辑器,删除对应于添加的大文件提交的线条,但保留其他一切不变。 保存并退出。 你的主分支应该只包含你想要什么,并没有大的文件。 需要注意的是git rebase-p将消除合并提交,所以你会留下后主人的线性历史<commit hash> 。 这可能是对你不错,但如果没有,你可以尝试使用-p ,但git help rebasecombining -p with the -i option explicitly is generally not a good idea unless you know what you are doing

然后,从运行情况A.命令



Answer 4:

作为loganfsmyth他已经说过的答案 ,你需要清除提交历史,因为这些文件继续甚至从回购删除它们后存在那里。 GitHub的官方文档建议BFG ,我觉得更容易使用比filter-branch

从历史中删除文件

下载从他们的网站BFG。 请确保你已经安装了Java,然后创建一个镜像克隆和清除​​历史记录。 请务必将YOUR_FILE_NAME与您要删除的文件的名称:

git clone --mirror git://example.com/some-big-repo.git
java -jar bfg.jar --delete-files YOUR_FILE_NAME some-big-repo.git
cd some-big-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

删除文件夹

同上,但使用--delete-folders

java -jar bfg.jar --delete-folders YOUR_FOLDER_NAME some-big-repo.git

其他选项

BFG还允许更炫选项(参见文档 )像这样的:

删除所有文件超过100M从历史中更大:

java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git

重要!

当运行BFG,要小心,既YOUR_FILE_NAMEYOUR_FOLDER_NAME确实只是文件/文件夹的名称。 他们不是路径 ,所以像foo/bar.jpg都不行! 相反,所有文件/文件具有指定名称的文件夹将从回购历史取出,不管他们存在哪些光路或支路。



Answer 5:

我的演出,但如果上面的回答没有解决的查询,然后我找到了另一种方式有点晚了。 只需删除从.pack特定的大文件。 我有这个问题,我在一个大的2GB文件检查意外。 我遵循的步骤在这个环节上解释说: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/



Answer 6:

这是一个多编码一个方便的解决方案。 压缩文件。 打开文件视图格式的zip(来自解压不同)。 删除.pack文件。 解压并替换文件夹。 奇迹般有效!



文章来源: Remove large .pack file created by git