我查文件的加载到一个分支,合并,然后不得不删除他们,现在我只剩下一个大.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 rebase
说combining -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_NAME
和YOUR_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