2014-01-28 19 views
0

對於給定的項目(目前我只在其中工作),我想對某些文件應用某種自動轉換。對於這個討論,讓我們假設我想在所有文本文件中將行結尾從Windows風格改變爲Unix風格。我希望新格式在過去的某些修訂中能夠有效,並貫穿歷史。從過去的修訂開始應用自動化文件轉換(轉換),保留歷史

我最常做的是:我開始一個互動的底墊和附加以下後,每次提交開始與所需的起點:

exec <transformation rule> 
exec git commit -m "transform" && git revert --no-edit HEAD 

這導致transform接着原來提交的序列,每個環繞着reverttransform,然後是最後的revert。然後我執行第二次互動式底膠,並擠壓所有三聯體revert - <original commit> - transform,並刪除最後的revert。第一個transform保持不變,其他所有transformrevert提交都消失。這個手動過程產生(幾乎)所需的結果(我不確定新提交的提交日期),但是我想知道可以使用filter-branch,fast-import或可能是一個自定義工具來自動執行此操作我在粗略搜索中錯過了。

回答

1

可能filter-branch是你想要在這種情況下。當你執行上面描述的源代碼時(當我仔細閱讀時,我希望鼓勵你的聰明才智,實際上!),你必須考慮給定的一系列提交一個序列變更,轉換。這就是爲什麼你必須介紹一個虛假的回覆,你必須在下一個交易中壓縮。因此你避免了衝突,這讓我最感興奮。

與此不同,git filter-branch在同一提交序列上給出了另一個「視圖」。序列中的每個提交都被視爲狀態不是轉換。你提供的過濾器改變了狀態本身。因此,你根本不必考慮衝突,他們根本無法到達。但是當然,你必須對序列中的每個提交應用相同的轉換。

因此,對於您的特定問題的答案:如果你想換行從DOS轉換爲UNIX,你應該簡單地運行如下命令:

git filter-branch --tree-filter 'find . -type f -print0 | xargs -0 perl -pi -e "s,\r\n,\n,;"' HEAD

perl -pi -e 's,\n,\r\n,;'是執行轉換命令,findxargs是一種收集當前目錄中的所有文件並將它們傳遞到perl的方法。請注意,git有它自己的CRLF魔術(請參閱man git-config,core.autocrlf,core.safecrlf.gitattributes文件),通常您不需要手動處理CRLF,適當的配置足以構建適用於Windows和類Unix系統的存儲庫。

+0

你在暗示哪個特定的「 - 過濾器」? – krlmlr

+0

更新了答案 – user3159253

+0

只是有機會測試'filter-branch'。它岩石。謝謝你指出我看起來很明顯。 – krlmlr