從某些行中刪除回車符 (^M),而不修改每一行

從某些行中刪除回車符 (^M),而不修改每一行

我有一些相當長的 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

相關內容