首頁 > 軟體

消除Git diff中^M的差異

2020-06-16 17:30:00

在Windows上把一個剛commit的資料夾上傳到了Ubuntu。在Ubuntu上使用git status檢視,發現很多檔案都被紅色標注,表示剛剛修改未add。在Windows上明明是working tree clean,同一個資料夾用FTP傳到了Ubuntu,怎麼會修改檔案內容呢?

於是,用git diff檢視檔案差異,每一行結尾都有^M標註。百度了一下,了解了原因:

這是由於換行符在不同的作業系統上定義的區別造成的。

Windows用CR LF來定義換行,Linux用LF。CR全稱是Carriage Return ,或者表示為r, 意思是回車。 LF全稱是Line Feed,它才是真正意義上的換行表示符。為什麼Windows新增一個CR和LF組合表示,我並不清楚。不過如果用git diff的時候看到^M字元,就說明兩個檔案在換行符上有所差別。

比如從我的Windows開發的同時那邊拿來一個目錄,就會發現幾乎所有的檔案都被修改過了。其實並不是這樣,都是由於檔案多了CR後造成的。

GitHub的幫助網站上給出了一種**解決方案**:

  • 在Windows的資料夾上新建一個.gitattributes檔案

  • 檔案內容如下:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
*.css text eol=crlf
*.js  text eol=crlf
*.md  text eol=crlf
*.txt text eol=crlf
*.sql text eol=crlf
*.php text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
  • 其中,幫助網站上有詳細介紹了text關鍵字。eol=crlf表示使用CRLF換行。

  • 根據Ubuntu上哪些型別的檔案被標紅, 便在.gitattributes上將text屬性設定為eol=crlf

  • 儲存檔案。

  • 檢視一下狀態:git status,發現.gitattributes修改未暫存

  • 暫存:git add .gitattributes

  • 提交:git commit -m "Add a .gitattributes file

  • 接下來上傳到Ubuntu上,.gitattributes就發揮了作用。使用git status檢視,整個工作區都清靜了。

本文永久更新連結地址http://www.linuxidc.com/Linux/2016-10/136329.htm


IT145.com E-mail:sddin#qq.com