如何大量刪除git倉庫中的提交紀錄?
某草草
某草草 2017-04-28 09:06:29
0
1
797

如何批量刪除一些很久之前的提交記錄,但保留那些修改的內容。

某草草
某草草

全部回覆(1)
滿天的星座

這個問題有一點 A/B,因為你沒有說明刪除很久之前的提交記錄的場景是什麼,這很重要因為會影響到接下來 Git 的使用選擇。舉例來說:

  1. 若我想刪除歷史記錄裡比較考前的提交,而後面還有很多需要保留的提交,則:
    1.2 如果要刪除的歷史記錄是分散的,則可以考慮 Interactive Rebase,自行挑選/合併等。如 git rebase -i <ref>
    1.1 如果要刪除的歷史記錄是連續的,比如說從最開始到某一刻全部都刪除或者是中間一截可以刪除,則可以考慮 Onto Rebase,如 git rebase --onto <ONTO_BASE_ref> <START_ref> <END_ref>,其中 STARTEND 之间的是需要保留的部分,而 ONTO_BASE 则是最新的基点;换言之,从 ONTO_BASESTART 之間的歷史記錄會被幹掉。
  2. 若我要刪除的歷史記錄很多,要保留的則很少(比如說就保留最近的一個,以前都不想要了),那索性可以直接創建 Orphan Branch 來重建歷史記錄。如 git checkout --orphan new_start,这条命令会创建一个叫做 new_start 的分支,该分支没有任何历史记录,但是所有的文件都会原封不动的存在,你可以据此开始重新提交。完成之后甚至可以把旧的分支直接废弃。另外,也可以指定新分支的起点,默认当然是从 HEAD 開始了。
  3. 你還可以把歷史記錄分成兩份(或更多份),其中有的完整,有的則簡化等等,具體參見這篇關於git replace 的文檔:http://git-scm.com/2010/ 03/17/replace.html

其實還有很多種場景可以說道,Git 的用法非常靈活,即使暫時用不到也值得細細過一遍知道它能做什麼樣的事情,然後遇到各種複雜的場景就可以自己推導出解決方案了。


身為 Repo 的維護者,最常見的事情就是從某一 ref 開始到 HEAD保留下來,然後先前的歷史刪除。因為這個任務比較常見,所以這裡也有一個 shell script 分享給你:

sh#!/bin/bash
git checkout --orphan temp 
git commit -m "截取的历史记录起点"
git rebase --onto temp  master
git branch -D temp

使用的時候這樣(例如該腳本保存叫 git-detach): git-detach <ref>,其中 <ref> 就是你要保留的歷史記錄的起點。

需要注意的是,這個腳本只是把歷史記錄「分離」開來,然後其中的一部分沒有了可見的引用因此在歷史記錄裡看不見,然而它們的git object 仍然存在(換言之你還能恢復過來,自行查閱git-reflog),如果你真要彻底丢掉这些历史(为了给 repo 减肥),可以用 git gc --prune,那就再也找不回來了。

P.S. 這個腳本依賴 Orphan Branch,低版本的 Git 不支援(大概是

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板