2011-06-16

[git] git filter-branch 應用 只保留指定的檔案及記錄

@see 核彈級選項: filter-branch
如果你想用腳本的方式修改大量的提交,還有一個重寫歷史的選項可以用——例如,全局性地修改電子郵件地址或者將一個文件從所有提交中刪除。這個命令是filter-branch,這個會大面積地修改你的歷史,所以你很有可能不該去用它,除非你的項目尚未公開,沒有其他人在你準備修改的提交的基礎上工作。儘管如此,這個可以非常有用。你會學習一些常見用法,借此對它的能力有所認識。
用 google 可以搜尋到一大堆能將 目錄取出來變成乾淨的分支 的資料
但是有時候你只是想取變成為只含有特定檔案的分支來做一些特殊用途

這時候 總不能先把目錄取出後 又一次一次的清除不要的檔案及記錄
那麼就可以試試看以下的用法

以下為指令
藍色部分為 想要留下的檔案 可以用表達式例如 (abc.php|cdf.txt|other.png)
$ git filter-branch --prune-empty -f --index-filter "git-rm-ex Valid.php"
相關需要用到的 git-rm-ex 為
#!/bin/sh

# 不知道為什麼嘗試性的加上 echo 後就正常搭配 git filter-branch 而沒有因為錯誤中斷
# $ git filter-branch --prune-empty -f --index-filter "git-rm-ex Valid.php"

git ls-files --no-empty-directory -- | egrep --invert-match $1 |
xargs git rm --cached --ignore-unmatch -f -- | echo
 以上指令中的 -f 選項 可以自己取捨是否要使用