(Git) 避免自動轉換斷行字元

  • 2737
  • 0

前言

因為專案會在 Linux 環境跟 Windows 環境下運行,所以遇到自動轉斷行字元的問題。

內文

因為我們系統是使用 Git ,環境是 Windows 所以 Git 會很貼心的幫我們把斷行字元轉成 Windows,這樣導致我們在 Linux 環境下執行某些檔案會出錯。

在Linux 平台下,文字的斷行字元預設為 LF 字元 ( \n )。在 Windows 環境下,文字的預設斷行字元卻是 CRLF ( \r\n )。

 以下提供了兩種解法 :

1.  將專案的自動轉換斷行字元全部關掉

  找到 .gitconfig ,並在 [core] 這邊找到 autocrlf,將值改為 false。如果没找到,就在 [core] 這邊中新增一行 autocrlf = false ,這段就是將自動轉換換行格式關掉。

[core]
    autocrlf = false
這種做法會對後續存入資料庫的檔案做 LF 標準化,但是不會對現有的檔案做標準化。
2. 針對檔案轉為二進位檔案 

 找到 .gitattributes ,並在裡面新增 要匹配的文件 屬性1  屬性2 就可以設定成二進位,就不會自動轉換換行格式了,範例如下。

adm/adm-scd/src/main/resources/discovery-runner.sh -text

對所有檔案做二進位方法如下。

*  !text
text

   直接通過屬性名進行設置,相當於設置text屬性的值為true。
對於設置了text屬性的文件,不再需要Git對文件類型進行猜測,而直接判定為文本文件並進行相應的換行符轉換。

-text

   在屬性名前用減號標識,相當於設置text屬性值為false。
對於設置了取反text屬性的文件,直接判定為二進製文件,在文件檢入和檢出時不進行換行符轉換。

!text

   在屬性名前面添加感嘆號,相當於該屬性沒有設置,即不等於true,也不等於false。
對於未定義text屬性的文件,根據Git是否配置了core.autocrlf配置變量,決定是否進行換行符轉換。因此對於text屬性沒有定義和進行取反text屬性設置,兩者存在差異。

text=auto

    屬性除了上述true、false、未設置三個狀態外,還可以對屬性用相關的枚舉值(預定義的字符串)進行設置。不同的屬性值可能有不同的枚舉值,對於text屬性可以設置為auto。
對於text屬性設置為auto的文件,文件類型實際上尚未確定,需要Git讀取文件內容進行智能判別,判別為文本文件則進行換行符轉換。顯然當設置text屬性為auto時,並不等同於true。

 

參考資料 

https://git-scm.com/docs/gitattributes 

https://blog.miniasp.com/post/2013/09/15/Git-for-Windows-Line-Ending-Conversion-Notes.aspx