from:http://beta.segmentfault.com/q/1010000002564327
作為 Repo 的維護(hù)者,最常見的事情就是從某一 ref 開始到 HEAD保留下來,然后之前的歷史刪除。因為這個任務(wù)比較常見,所以這里也有一個 shell script 分享給你:
#!/bin/bash git checkout --orphan temp $1 git commit -m "截取的歷史記錄起點" git rebase --onto temp $1 master git branch -D temp
使用的時候這樣(比如該腳本保存叫 git-detach
): git-detach <ref>
,其中 <ref>
就是你要保留的歷史記錄的起點。
需要注意的是,這個腳本只是把歷史記錄“分離”開來,然后其中的一部分沒有了可見的引用因此在歷史記錄里看不見,然而它們的 git object 仍然存在(換言之你還能恢復(fù)過來,自行查閱 git-reflog
),如果你真要徹底丟掉這些歷史(為了給 repo 減肥),可以用 git gc --prune
,那就再也找不回來了。
P.S. 這個腳本依賴 Orphan Branch,低版本的 Git 不支持(大概是 < v1.7.x),有替代方案自己 Google 吧
$ git filter-branch --tree-filter 'rm -f testme.txt' HEADRewrite bb383961a2d13e12d92be5f5e5d37491a90dee66 (2/2)
Ref 'refs/heads/master'
was rewritten
$ git ls-remote .
230b8d53e2a6d5669165eed55579b64dccd78d11 HEAD
230b8d53e2a6d5669165eed55579b64dccd78d11 refs/heads/master
bb383961a2d13e12d92be5f5e5d37491a90dee66 refs/original/refs/heads/master
$ git update-ref -d refs/original/refs/heads/master [bb383961a2d13e12d92be5f5e5d37491a90dee66]
$ git ls-remote .
230b8d53e2a6d5669165eed55579b64dccd78d11 HEAD
230b8d53e2a6d5669165eed55579b64dccd78d11 refs/heads/master
$ rm -rf .git/logs
$ git reflog --all
$ git prune
$ git gc
$ du -hs
84K .