我有一個Git倉庫,它有一些DOS格式的文件(\r\n
行尾)。我想通過dos2unix
運行文件(這會將所有文件更改爲UNIX格式,其中\n
行結束),但這會對歷史造成多大的影響,是否會推薦?Git:從源代碼控制文件中刪除回車
我假設標準總是使用UNIX行尾作爲源代碼控制文件,並且可以選擇本地切換到特定於OS的行尾?
我有一個Git倉庫,它有一些DOS格式的文件(\r\n
行尾)。我想通過dos2unix
運行文件(這會將所有文件更改爲UNIX格式,其中\n
行結束),但這會對歷史造成多大的影響,是否會推薦?Git:從源代碼控制文件中刪除回車
我假設標準總是使用UNIX行尾作爲源代碼控制文件,並且可以選擇本地切換到特定於OS的行尾?
您必須使用的方法取決於您的存儲庫是如何公開的。
如果您不介意或關心更改所有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
謝謝。現在我是唯一一個在存儲庫上工作的人,因爲它非常「年輕」,所以重寫歷史記錄應該不成問題。但是'git filter-branch'會在github上播放(我已經把存儲庫放在那裏)了? – Blixt 2010-03-18 10:51:33
我想,你必須刪除github上的所有分支和標籤,以確保它們可以被重新創建。 (它*可能*沒有這個工作,但也許重新開始更好。)或者,你刪除整個回購,然後再推一次。這應該可以用github找到,除非有人從中克隆。然後他們需要做同樣的事情,這取決於他們與git的流暢程度。 – Debilski 2010-03-18 11:08:31
好的。我剛剛刪除了存儲庫,並重新推出了修改過的歷史記錄。無論如何,我需要解決一些舊的提交消息也是多行的問題。 – Blixt 2010-03-18 11:57:51
對於持續的解決方案,看看在core.autocrlf(和core.safecrlf)config parameters。
這樣做一次到您的整個存儲庫只會創建一個很不可能合併的提交(因爲這些文件中的每一行都會被修改),但是一旦您通過它,應該沒什麼大不了的。 (是的,你可以使用git filter-branch
一直修改歷史,但有點可怕)。
當我們從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配置相同。
如果你的版本控制文件的列表包括二進制文件,或者你不能輕易改變歷史......這裏是一個方便的花花公子的一行:
的興趣在此人相關的問題: http://stackoverflow.com/questions/446244/are-crlf-lines-ok-in-a-rails-project-deployed-on-linux – Blixt 2010-03-18 11:06:50