將所有二進制文件錯誤地添加到我的git歷史記錄中,我有一個大小約爲50 MB的git repo。如何在歷史記錄的特定提交之前刪除所有提交?例如,有以下歷史記錄,我想在C2之前刪除所有提交,就像C2是第一次提交一樣。 (其實C2可能是一個合併提交)如何在特定提交之前截斷git歷史記錄?
我已經試過git-filter-branch,它根本不會做我需要的東西,而this腳本似乎很安靜流行,雖然它消除了整個歷史;留下一個提交。
將所有二進制文件錯誤地添加到我的git歷史記錄中,我有一個大小約爲50 MB的git repo。如何在歷史記錄的特定提交之前刪除所有提交?例如,有以下歷史記錄,我想在C2之前刪除所有提交,就像C2是第一次提交一樣。 (其實C2可能是一個合併提交)如何在特定提交之前截斷git歷史記錄?
我已經試過git-filter-branch,它根本不會做我需要的東西,而this腳本似乎很安靜流行,雖然它消除了整個歷史;留下一個提交。
我建議用櫻桃採摘之後一個新的分支孤兒。
這樣你可以檢查一切,甚至可以將舊狀態作爲備份保留在你的機器上。
要啓動的事情在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
應該是你需要的所有空間。
櫻桃採摘(和重新綁定)不保留線性歷史以外的任何內容 - 您必須手動處理合並,如果你想讓他們在 新的歷史。 – ephemient
@ephemient你是完全正確的。如果您的新開始提交後的歷史記錄已合併,則「櫻桃採摘」不是真正的選項。使用'filter-branch'會更乾淨。如果你擴大你的答案,並解釋我將愉快地提升它的選項 – AnimiVulpis
使用git filter-branch
,而不是刪除整個提交,你可以從刪除該二進制文件的提交:
git filter-branch --index-filter 'git rm --cached -rf bin/ && git rm --cached -f ./a.out' -- --all
一種方式來做到這一點是使用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
'git的變基-i'然後刪除C1 – ckruczek
附加問題:請問您是如何創建該插圖的? –
@ LasseV.Karlsen:他從git-scm網站上下載了它。但我可以推薦使用[this](https://onlywei.github.io/explain-git-with-d3/)智能工具或[gitgraph](http://gitgraphjs.com) – ckruczek