2017-04-19 167 views
2

將所有二進制文件錯誤地添加到我的git歷史記錄中,我有一個大小約爲50 MB的git repo。如何在歷史記錄的特定提交之前刪除所有提交?例如,有以下歷史記錄,我想在C2之前刪除所有提交,就像C2是第一次提交一樣。 (其實C2可能是一個合併提交)如何在特定提交之前截斷git歷史記錄?

我已經試過git-filter-branch,它根本不會做我需要的東西,而this腳本似乎很安靜流行,雖然它消除了整個歷史;留下一個提交。

History

+0

'git的變基-i'然後刪除C1 – ckruczek

+0

附加問題:請問您是如何創建該插圖的? –

+0

@ LasseV.Karlsen:他從git-scm網站上下載了它。但我可以推薦使用[this](https://onlywei.github.io/explain-git-with-d3/)智能工具或[gitgraph](http://gitgraphjs.com) – ckruczek

回答

0

我建議用櫻桃採摘之後一個新的分支孤兒。

這樣你可以檢查一切,甚至可以將舊狀態作爲備份保留在你的機器上。


要啓動的事情在C2

$ git checkout <Hash of C2> 
$ git checkout --orphan new-master 

git checkout --orphan點關創建一個新的分支將創建一個新的分支,沒有父母。

此時根據需要添加或與

  • git add喜歡將文件添加爲這個新的第一次提交
  • git rm --cached爲新的第一刪除文件提交,但留給他們的硬盤上刪除文件
  • git rm刪除第一次提交以及從硬盤中刪除的文件

確保所有文件都存在將來會被更改,否則櫻桃採摘可能會變得非常混亂。

現在git commit讓您的新初始提交準備就緒。

最後但並非最不重要只需cherry-picking重新應用所有其他提交的正確範圍。

$ git branch new-starting-point # for future reference 
$ git cherry-pick ^C2 master 

對所有其他需要新歷史記錄的分支重複這些步驟。

$ git checkout -b new-server new-starting-point 
$ git cherry-pick ^C2 server 

如果你要檢查你可能想要做一些git diff master new-master正確性。

要清除空間刪除所有舊分支(以便舊的提交不可到達)。在接下來的步驟中,您可能會丟失數據。確保你仍然擁有你想要的一切:一個git gc應該是你需要的所有空間。

+0

櫻桃採摘(和重新綁定)不保留線性歷史以外的任何內容 - 您必須手動處理合並,如果你想讓他們在 新的歷史。 – ephemient

+0

@ephemient你是完全正確的。如果您的新開始提交後的歷史記錄已合併,則「櫻桃採摘」不是真正的選項。使用'filter-branch'會更乾淨。如果你擴大你的答案,並解釋我將愉快地提升它的選項 – AnimiVulpis

0

使用git filter-branch,而不是刪除整個提交,你可以從刪除該二進制文件的提交:

git filter-branch --index-filter 'git rm --cached -rf bin/ && git rm --cached -f ./a.out' -- --all 
1

一種方式來做到這一點是使用git filter-branch --parent-filter,並從對父母的下降C1 。

$(git rev-parse C1)來獲得完整的40個字符的提交ID,如果你已經知道它是什麼可以替代的。

如果某些C1的祖先正在通過合併拉或等,你也可以把它們以同樣的方式,或使用更復雜的腳本像

git filter-branch --parent-filter ' 
    for i in $(cat); do 
     if [[ $i = -* ]] || git merge-base --is-ancestor "$i" C1; then 
      continue 
     else 
      echo -n " -p $i" 
     fi 
    done 
' -- --all 
相關問題