2008-10-30 63 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,沒有參數。

相關問題