引言
在做嵌入式 Linux 開發的的程序員,不乏在 Windows 環境下編寫代碼,然后再復制到 Linux 系統中進行編譯。代碼托管或者版本管理絕大部分使用 git。
這樣的開發流程,相信很多開發者在用:從 git 拉取代碼到 Windows 系統中,添加或修改代碼后,復制到 Linux 中進行編譯,然后再下載到目標板運行。
然而,本來應該是正常的開發,卻遇到了問題。
問題描述
某個項目需要添加新的功能,便從 git 服務器上拉取已有的工程代碼到 Windows 系統進行開發。修改完代碼之后,復制到 Linux 虛擬機進行編譯,卻發現報錯了,編譯不通過。
當時覺得很奇怪,已經上線的程序,竟然會編譯失敗。經過一些列的對比查找,發現了一些端倪,代碼文件真的不一樣!
在 Linux 系統中打開工程文件,發現每行的結尾有特殊符號 “^M”。由此考慮,應該是文件換行符不一致引起的錯誤。這個特殊的換行符,使得工程中有些關鍵腳本文件執行失敗,從而導致工程編譯失敗或者目標程序執行異常。
為什么會出現特殊符號 “^M” 呢?
問題原因
不同操作系統的換行符是不一樣的。Unix/Linux 系統使用的是 LF 用作換行符;Windows 一直使用的 CRLF(即,回車 CR和換行 LF)作為換行符。將 Windows 系統下的文件,在Linux 下打開,就會在每行的末尾顯示 “^M”。
然而, git 入庫的代碼采用的是 LF 格式換行。
為了實現跨平台的寫作,git 提供了 “換行符自動轉換” 功能。如果在 Windows 安裝 git,在拉取文件時,會自動將 LF 換行符替換為 CRLF:在提交時,又會將 CRLF 轉化為 LF。
問題解決
解決問題的方法是:禁用 git 的換行符自動轉換功能。
解決方法一
修改 git 的本地配置文件。在本地路徑 C:\Users\[用戶名]目錄下,找到配置文件 .gitconfig,在 “[core]” 下添加如下內容:
autocrlf = false
filemode = false
safecrl = true
解決方法二
通過命令行修改 git 的配置:
/* 不轉換換行符 */
git config --global core.autocrlf false
/* 忽略文件權限修改 */
git config --global core.filemode false
/* 允許提交包含混合換行符的文件 */
git config --global core.safecrlf true
關注微信公眾號【一起學嵌入式】,一起學習,一起成長