2012-07-09 112 views
7

我们正在运行一个中央git存储库(gforge),每个人都从中拉出并推送。不幸的是,一些不合适的同事决定将几个10-100Mb的jar文件放入回购库是个好主意。由于这个原因,我们使用的服务器已经耗尽了磁盘空间。从git中删除大型提交

我们才意识到这一点,当时已经太迟了,大多数人都拉了新的巨大回购。如果问题没有得到解决,那么我们可以做一个重定位来分割那些巨大的提交并修复它,但是现在每个人都已经从中撤出了,那么删除提交的最好方法是什么?删除大文件),然后有这个而不是当每个人都想要拉/推/从回购时导致混乱?

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

回答

6

检查了这一点https://help.github.com/articles/remove-sensitive-data。在这里,他们写从Git仓库删除敏感数据,但可以很好的使用它从您提交移除大型文件。

+1

我以前经历过这个指南,但是在我抛弃了提交之后会发生什么?人们已经拉动了怪物的承诺。可能发生的事情是有人会先进行本地提交然后进行推送,它会呻吟说需要合并,所以他们会合并并推送,并且怪物提交会再次返回。如何确保不会发生这种情况(将所有发送给他们的电子邮件都不太可能奏效!) – agentgonzo 2012-07-09 15:44:07

+0

删除不需要的文件后,始终建议您将它们添加到.gitignore文件中。这样,Git将停止跟踪这些文件并阻止它再次被推送。 – 2012-07-10 05:18:46

+0

Sanhka,它并不妨碍他们被推 - 它阻止他们承诺。因此,他们已经承诺,推动会让他们回来。 – agentgonzo 2012-07-11 09:57:54

8

,以避免混乱的最简单的方法就是给服务器更多的磁盘。

这是一个艰难的一个。卸下文件需要从历史中删除,也这只能用git filter-branch来完成,这个命令,比如说wo ULD从历史中删除<file>

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <file>' \ 
--prune-empty --tag-name-filter cat -- --all 

问题是这样的重写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
+0

为服务器提供更多的磁盘空间并不是一个理想的解决方案,因为在家工作的人们仍然需要通过其宽带连接来提取数百MB,而这应该是几百KB。我可能不得不做一个过滤分支并发送大量电子邮件,说“你的东西会失败 - 隐藏你的本地更改,导出为补丁,然后删除你的本地回购 - 然后重新启动” – agentgonzo 2012-07-09 15:45:59

+0

是的,我盯着一个类似于这在几个月前。你的想法或多或少正是我所做的,除了我的同事对修补程序有点不安。我最终为他们做了。花了一个下午。我编辑了你的计划,并添加了一些命令,以防某些人稍后绊倒你。 – Christopher 2012-07-09 16:04:51

4

除了其他答案,您可能需要考虑添加一些针对未来巨型jar文件的先发制人的保护措施,其形式为禁止用户使用的预先接收挂钩(或至少“非管理员用户“)推送非常大的文件或名为*.jar的文件,或任何看起来最好的文件。

我们之前已经做过这种事情,包括禁止特定的提交ID,因为某些用户无法获得“将工作保存在临时分支上,重置并拉出并重新应用工作,减去巨型文件“。

请注意,预接收挂钩运行在一个相当有趣的上下文中:文件实际上已上传,只是引用(通常是分支头)还没有真正改变。您可以防止分支机构发生变化,但您仍将使用(临时性的,直到gc'ed)的磁盘空间和网络带宽。

0

使用filter-branch!

git filter-branch --tree-filter 'find . -name "*.jar" -exec rm {} \;' 

然后,只需清除所有没有任何文件将它们与提交:

git filter-branch -f --prune-empty -- --all 
+0

'--index-filter'可以和'--tree-filter'基本相同,但速度更快。 – 2015-05-08 08:10:43

-1

中的gforge这里的家伙。甚至认为这主要是一个git的问题,我想提供两件事情:

  1. Starting in GForge 6.3,网站管理员可以识别正在使用过多的磁盘项目,以及旧的和孤立的项目。这可以帮助您避免全盘情况,特别是如果您有很多独立的团队和项目。
  2. 在GForge中轻松实现git钩子(一般SCM钩子)。站点管理员可以配置任意数量的钩子命令,然后项目级别的人员可以选择他们想要的项目钩子。添加一个防止文件的某些类型(或大小?)的钩子将非常适合此功能。