从git中删除大型提交

age*_*nzo 9 git git-filter-branch

我们正在运行一个中央git存储库(gforge),每个人都会从中推出并推送.不幸的是,一些无能的同事已经决定将几个10-100Mb jar文件推入回购中是一个好主意.因此,我们使用的服务器已经耗尽了磁盘空间.

我们才意识到这一点,为时已晚,而且大多数人已经撤回了新的大型回购.如果没有推出问题,那么我们可以做一个rebase来剪掉那些巨大的提交并修复它,但是现在每个人都已经从中撤出了,删除该提交的最佳方法是什么(或者做一个rebase to just删除大文件)当每个人都想从/向回购/推送/推送时,这不会导致混乱?

它应该是脚本的小型回购,但现在大小约为700M :-(

Chr*_*her 9

避免混乱的最简单方法是为服务器提供更多磁盘.

这是困难的一个.删除文件也需要从历史记录中删除它们,这只能通过它来完成git filter-branch.例如,此命令<file>将从历史记录中删除:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <file>' \
--prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

问题是这会重写SHA1哈希值,这意味着团队中的每个人都需要重置为新的分支版本,否则会有一些严重的问题.如果没有人正在进行中并且你们都使用主题分支,这一切都很好.如果你更集中,你的团队很大,或者他们中的许多人在工作时保持脏工作目录,没有一点混乱和不和谐就没有办法做到这一点.你可以花很长时间让每个人的本地工作正常.写的,git filter-branch可能是最好的解决方案.只要确保你有一个计划,你的团队了解它,并确保他们备份他们的本地存储库,以防一些正在进行的重要工作丢失或被摧毁.

一个可能的计划是:

  1. 让团队生成他们正在进行的工作的补丁,例如git diff > ~/my_wip.
  2. 让团队为他们承诺但未共享的工作生成补丁: git format-patch <branch>
  3. git filter-branch.确保团队知道在发生这种情况时不要拉扯.
  4. 让团队发布git fetch && git reset --hard origin/<branch>或让他们重新克隆存储库.
  5. 应用他们以前承诺的工作git am <patch>.
  6. 将他们正在进行的工作应用于git apply,例如git apply ~/my_wip.


San*_*ria 6

看看这个https://help.github.com/articles/remove-sensitive-data.在这里,他们写了关于从Git存储库中删除敏感数据的文章,但您可以很好地使用它从提交中删除大文件.