2010-03-18 81 views
15

我有一個Git倉庫,它有一些DOS格式的文件(\r\n行尾)。我想通過dos2unix運行文件(這會將所有文件更改爲UNIX格式,其中\n行結束),但這會對歷史造成多大的影響,是否會推薦?Git:從源代碼控制文件中刪除回車

我假設標準總是使用UNIX行尾作爲源代碼控制文件,並且可以選擇本地切換到特定於OS的行尾?

+1

的興趣在此人相關的問題: http://stackoverflow.com/questions/446244/are-crlf-lines-ok-in-a-rails-project-deployed-on-linux – Blixt 2010-03-18 11:06:50

回答

10

您必須使用的方法取決於您的存儲庫是如何公開的。

如果您不介意或關心更改所有SHA,因爲您或多或少是使用它的唯一用戶,但希望所有時間都解決此問題,則可以運行git filter-branch並將dos2unix應用於所有每次提交中的文件。 (如果您共享知識庫,其他人都需要更多或更少來完全更新它,所以這可能是有危險的。)

所以更好的選擇和更簡單的方法是隻在當前頭部進行更改。這意味着你過去的提交仍然有\r\n結局,但是除非你從過去做了很多挑選,這應該不成問題。當然,diff工具可能會更頻繁地發出抱怨,但通常情況下,您只會在提交附近進行比較,所以此問題會在提交累積時自行解決。

而UNIX行結尾是標準的,你對此是正確的。最好的辦法是設置你的編輯器,只在Windows上寫這些結尾。否則,您也可以使用autocrlf設置。


加入到歷史重寫部分:

上次我也一樣,我用下面的命令將所有文件更改爲UNIX的結局。

#!/bin/bash 
all2dos() { find * -exec dos2unix {} \; } 
export -f all2dos 
git filter-branch -f --tree-filter 'all2dos' --tag-name-filter cat --prune-empty -- --all 
+0

謝謝。現在我是唯一一個在存儲庫上工作的人,因爲它非常「年輕」,所以重寫歷史記錄應該不成問題。但是'git filter-branch'會在github上播放(我已經把存儲庫放在那裏)了? – Blixt 2010-03-18 10:51:33

+0

我想,你必須刪除github上的所有分支和標籤,以確保它們可以被重新創建。 (它*可能*沒有這個工作,但也許重新開始更好。)或者,你刪除整個回購,然後再推一次。這應該可以用github找到,除非有人從中克隆。然後他們需要做同樣的事情,這取決於他們與git的流暢程度。 – Debilski 2010-03-18 11:08:31

+0

好的。我剛剛刪除了存儲庫,並重新推出了修改過的歷史記錄。無論如何,我需要解決一些舊的提交消息也是多行的問題。 – Blixt 2010-03-18 11:57:51

4

對於持續的解決方案,看看在core.autocrlf(和core.safecrlf)config parameters

這樣做一次到您的整個存儲庫只會創建一個很不可能合併的提交(因爲這些文件中的每一行都會被修改),但是一旦您通過它,應該沒什麼大不了的。 (是的,你可以使用git filter-branch一直修改歷史,但有點可怕)。

22

當我們從svn轉換到git(在一箇中央(裸)像),這crlf的事情讓我們瘋狂, scm環境。最終得到的結果是,我們將全局.gitconfig文件複製到每個人的用戶根目錄(是Windows和Linux),最初來自Windows系統,core.autocrlf = true和core.safecrlf = false,在Linux用戶上(比如bash腳本無法運行,以及所有這些可怕的^ M)。所以我們最初做了一個簽出和克隆腳本,在這些命令後執行了dos2unix。然後,我運行core.autocrlf和core.safecrlf配置項並根據O/S進行設置:

Windows:core.autocrlf = true and core.safecrlf = false Linux:core.autocrlf = input and核心。safecrlf =假

這些條帶: ---在Windows ---

git config --global core.autocrlf true 
git config --global core.safecrlf false 

---在Linux上---

git config --global core.autocrlf input 
git config --global core.safecrlf false 

然後爲我們的Linux開發人員,我們建立一個小小的bash腳本/ usr/local/bin/gitfixcrlf:

#!/bin/sh 
# remove local tree 
git ls-files -z | xargs -0 rm 
# checkout with proper crlf 
git checkout . 

他們只需要在本地sa上運行ndbox克隆一次。任何未來的克隆都正確完成。現在任何未來推送都被正確處理。所以,這解決了我們的多個O/S問題與換行。另請注意,Mac與Linux配置相同。