1. 程式人生 > 其它 >使用 git 拉取的程式碼問題解決

使用 git 拉取的程式碼問題解決

引言

在做嵌入式 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