【问题标题】:How to remove large file permanently for the whole team如何为整个团队永久删除大文件
【发布时间】:2011-07-15 02:25:44
【问题描述】:

我团队中的某个人将一个大文件推送到了 git 服务器,团队中的每个人现在都有一个包含该大文件的项目的克隆。

我按照http://help.github.com/removing-sensitive-data/ 中的指南进行操作,它可以在我的本地源代码树以及远程服务器上运行。但是一旦另一个人从远程服务器获取新数据,他将通过向服务器推送新的提交来轻松地重新引入大文件。

通常,团队成员会执行以下操作来与他人分享他的提交:

git fetch origin
git rebase origin/master
git push origin

在'rebase'的步骤中,旧的大文件被重新引入到他的本地提交中。当然,直接的方法是要求团队中的每个人在我删除大文件后重新克隆项目,但并不是每个人都愿意这样做。除了为所有人重新克隆整个项目之外,我正在寻找其他方法。

有什么建议吗?谢谢。

【问题讨论】:

  • 我不知道如果他们再次推动,他们将如何引入巨大的对象。推送仅推送 old_commit..new_commit 中的任何提交中的提交可访问的对象。
  • 假设你有一个提交历史 A-B-C-D-E。有人在提交 C 中添加了大对象。然后我删除了该对象,从 C 重写历史并将新的历史强制推送到服务器。历史现在是 A-B-C'-D'-E'。另一个成员一开始已经克隆了整个项目,他的本地历史也是 A-B-C-D-E。在他获取新的历史记录后,本地提交发生了分歧,即 A-B-C'-D'-E' 在 origin/master 上,而 A-B-C-D-E 在 master 分支上。在 rebase 之后,新的历史就像 A-B-C'-D'-E'-C-D-E,然后他推送到服务器 - 旧的提交 C 被重新引入。

标签: git purge


【解决方案1】:

progit book 有一个使用git filter-branch 的详细示例(不是其他帖子提到的过滤树)。章节在这里

'移除对象' http://progit.org/book/ch9-7.html

【讨论】:

【解决方案2】:

看看过滤树。您需要编辑引入文件的提交。完成后,每个人都可以获取。这将在其 repos 中创建非快进远程分支 - 现在删除有问题的文件后的每次提交都将有所不同。当他们在新的远程分支上重新调整当前更改时,它不应该再推送大对象了。

另一种方法是使用git rebase --preserve-merges -i 编辑有问题的提交。

【讨论】:

  • > "当他们在新的远程分支上重新调整当前更改时,它不应该再推送大对象了。"这是我的问题,事实上他们确实在 rebase 之后再次重新引入了文件,因为旧的提交仍然存在于他们的本地存储库中。
  • 如果遥控器已清理干净,请再次克隆。
  • 我知道,但我正在寻找另一种方法,而不是再次克隆它。
  • 为什么?现在你摆脱了巨大的物体应该很快。备份您的 reflog 和 rerere 并在克隆后恢复它们,如果你想恢复它们。
  • 如果你的网络很慢,让一个人来做,然后用运动鞋网把它转给其他开发者。
【解决方案3】:

如果删除大文件的执行时间合理,可以写一个脚本将文件删除,指示大家rebase后在本地运行脚本,并使用hook检查是否重新引入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 2019-06-23
    • 2020-11-10
    • 2020-12-09
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    相关资源
    最近更新 更多