我有一些相當長的 C++ 文件,並且git diff --check
報告^M
大約 15 行不同的行中有一些回車符。這是在 Windows 7 電腦上。在搜尋了幾個解決方案之後,即 Visual Studio 的 Advanced Save Options
或 Notepad++ 的 EOL Conversions,它們似乎都在修改每一行,而不僅僅是 Git 抱怨的那些。這會導致每行的 git diff 被替換。
這是否是因為以前對這些文件的所有更改也都有回車符^M
,並且之前對其的提交忽略了任何回車符警告?
運行返回 true,但是當我在暫存檔案後git config core.autocrlf
運行該檔案時,暫存檔案不會執行任何操作。git diff --cached --check
有什麼方法可以去除它們嗎?手動去排隊並嘗試更改似乎沒有幫助。
答案1
15行?
在記事本++中,選擇替換。選擇延長。搜尋 \r (即 ^M)並替換為任何內容(除非您想要換行符,則替換為 \n)。由於您不想替換所有 ^M,因此不要按全部替換,而是選擇要替換的內容。
如果您使用常規 Windows 記事本,^M 將顯示為方塊。您可以移除這些框。醜陋,但它有效。
答案2
使用dos2unix <file>
如果在命令列上。它將修復所需的行結尾,或者如果不需要,則不執行任何操作。執行一個find . -name "*.cpp" -exec dos2unix {} +
操作多個檔案。然後與git diff
提交前進行比較。
最好避免在文件中出現混合行結尾。它會讓合併和追隨歷史變得尷尬。
有些編輯器不會改變樣式,但我認為即使文件中有一個 ^M ,一些編輯器也會採用 dos 樣式並在寫入文件時更改所有行結尾。
通常可以找到編輯器的設置,使編輯器堅持您想要的樣式。行尾和製表符設定通常也根據樣式進行設定。
答案3
Git 可以使用git config --global core.autocrlf true
.但它是在結帳時或提交時執行的。因此 git 不會顯示暫存的更改,但如果您的編輯器引入了一些新的不需要的行結尾,則應該悄悄地進行轉換。
我認為如果不需要的行結尾已經在存儲庫中,請使用 dos2unix。
詳細內容請看這裡的回答: https://stackoverflow.com/questions/10418975/how-to-change-line-ending-settings並閱讀http://git-scm.com/book/en/Customizing-Git-Git-Configuration#Formatting-and-Whitespace
答案4
在 Windows 機器上你可以這樣做:
for /r %f in (*.js) do "c:\Program Files\git\usr\bin\dos2unix.exe" %f
這將從目前目錄下所有副檔名為 .js 的檔案中刪除 CR