2008-10-30 87 views
79

我们有一个有很大的历史的git项目。崩溃的git存储库的历史

具体来说,在项目的早期阶段,项目中有相当多的二进制资源文件,现在已经被删除,因为它们是有效的外部资源。

但是,由于先前提交了这些文件,因此我们的存储库大小大于200MB(总计结算大约为20MB)。

我们想要做的就是“折叠”历史记录,以便版本库看起来是从以后的版本创建而来的。例如

1-----2-----3-----4-----+---+---+ 
        \  /
        +-----+---+---+ 
  1. 库中创建
  2. 大集的二进制文件添加
  3. 大集的二进制文件中删除
  4. 新的预期仓库

的“开始”所以我们实际上想要在某个点之前失去项目历史。此时只有一个分支,所以不需要处理多个起始点等问题。但是,我们不希望丢失所有历史记录,并使用当前版本启动新的存储库。

这是可能的,还是我们注定永远有一个臃肿的存储库?

回答

88

您可以删除二元膨胀并保留其余的历史记录。 Git允许你在提交之前重新排序和“挤压”,所以你可以只提交添加和删除你的大二进制文件的提交。如果增加全部在一个提交中完成,并且在另一个提交中完成,那么这比处理每个文件要容易得多。

$ git log --stat  # list all commits and commit messages 

搜索这对于添加和删除您的二进制文件,并注意其SHA1s,在提交说2bcdef3cdef3

然后要编辑回购的历史记录,请使用rebase -i命令及其交互选项,从提交您的二进制文件的提交的父级开始。这将启动$ EDITOR,你会看到开始2bcdef提交列表:

$ git rebase -i 2bcdef^ # generate a pick list of all commits starting with 2bcdef 
# Rebasing zzzzzz onto yyyyyyy 
# 
# Commands: 
# pick = use commit 
# edit = use commit, but stop for amending 
# squash = use commit, but meld into previous commit 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# 
pick 2bcdef Add binary files and other edits 
pick xxxxxx Another change 
    . 
    . 
pick 3cdef3 Remove binary files; link to them as external resources 
    . 
    . 

插入squash 3cdef3作为第二线,并删除它说pick 3cdef3从列表行。您现在有一个交互式rebase的操作列表,它将提交中添加和删除二进制文件的提交组合为一个提交,其差异仅仅是这些提交中的任何其他更改。然后,它会重新应用所有后续提交的为了,当你告诉它来完成:

$ git rebase --continue 

这将需要一两分钟。
您现在有一个不再有二进制文件进入或退出的回购。但是他们仍然会占用空间,因为默认情况下,Git会保留30天左右的变化,然后才能进行垃圾回收,这样您就可以改变主意。 如果要立即将其删除:

$ git reflog expire --expire=1.minute refs/heads/master 
     #all deletions up to 1 minute ago available to be garbage-collected 
$ git fsck --unreachable  # lists all the blobs(files) that will be garbage-collected 
$ git prune 
$ git gc      

现在你已经删除了膨胀,但保持你的历史的其余部分。

+1

好,并通过回答。 – JesperE 2008-11-02 17:01:10

+7

你只需要记住,如果其他人已经从该存储库中取出,重写历史会混淆他们的拉。 git-rebase手册介绍了如何恢复其他回购协议。 http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html – Otto 2009-01-24 16:26:17

6

git-fast-export你在找什么?

NAME 
    git-fast-export - Git data exporter 

SYNOPSIS 
    git-fast-export [options] | git-fast-import 

DESCRIPTION 
    This program dumps the given revisions in a form suitable to be piped into git-fast- 
    import(1). 

    You can use it as a human readable bundle replacement (see git-bundle(1)), or as a kind 
    of an interactive git-filter-branch(1). 
21

感谢JesperE的文章中,我看着git-filter-branch - 这实际上可能是你想要的。看起来你可以保留你以前的提交,除非你的大文件被移除后才会被修改。从git-filter-branch man page

假设你要删除一个文件(包含机密信息或侵犯版权)的所有承诺:

git的过滤分支--tree过滤器“rm文件名” HEAD

一定要阅读那个手册页......显然你会想在存储库的备用克隆上这样做,以确保它按预期工作。

+2

查看github的链接...使用git-filter-branch命令有一些强大的选项:https://help.github.com/articles/remove-sensitive-data – ricosrealm 2013-01-09 05:31:30

25

你可以使用git filter-branch移植,使提交号码4分支的新的根提交。只是在它包含提交数4

的SHA1只有一行创建文件.git/info/grafts如果你现在做一个git loggitk你会看到,这些命令将显示提交数4作为分支的根。但是在您的存储库中实际上没有任何变化。您可以删除.git/info/grafts,并且git loggitk的输出将与以前一样。为了使提交号码4实际上成为新的根,你将不得不运行git filter-branch,没有参数。