Git 行尾设置须知
1 背景
遠端文件拉取到本地后,會根據(jù)本地機器的操作系統(tǒng)、或文件編輯器,修改文件內(nèi)容的行尾。例如遠端代碼為適配其代碼托管的宿主、存儲服務(wù)器與編譯構(gòu)建環(huán)境,通常采用 LF 作為行尾,符合 Linux 文件系統(tǒng)習(xí)慣。而本地為 Windows 的機器則應(yīng)在獲取文件后將行尾從 LF 轉(zhuǎn)換為 CRLF,適配 Windows 文件系統(tǒng)習(xí)慣。在本地做完文件修改進行提交,并準備推送回遠端,行尾則應(yīng)從 CRLF 轉(zhuǎn)換回 LF。而本地為 Linux 的機器則無需對行尾做任何轉(zhuǎn)換,始終以 LF 為行尾。
如何使文件的行尾在合適的環(huán)境使用合適的格式
- 避免不合適的格式出現(xiàn)在遠端,如以 CRLF 行尾的文件推送至服務(wù)器。
- 避免行尾因本地環(huán)境的不同,而無法達成統(tǒng)一,在遠端被反復(fù)來回修改。
- 避免行尾的適配轉(zhuǎn)換被識別為常規(guī)的變更,影響其他文件內(nèi)容變更的跟蹤。
- 避免文件行尾格式不正確導(dǎo)致無法在特定系統(tǒng)中被執(zhí)行,如 *.bat 需要 CRLF 行尾在 Windows 中執(zhí)行,*.sh 需要 LF 行尾在 Linux 中執(zhí)行。
這就需要能夠自動進行行尾設(shè)置的工具來幫忙。恰巧 git / git for windows 內(nèi)置提供此類設(shè)置功能。
2 行尾設(shè)置
2.1 通用
在倉庫的根目錄下使用 .gitattributes 文件設(shè)置行尾,此設(shè)置將直接影響遠端對于文件行尾的應(yīng)用,從而全局的影響所有從遠端拉取文件到本地的開發(fā)人員。此處需要單獨為 *.bat 和 *.sh 設(shè)置其在遠端存儲時所用的行尾,因為這兩類文件的行尾設(shè)置會直接影響文件是否能夠執(zhí)行,其他文件則不受影響,如 *.cs 即使使用 LF 行尾仍然能夠正常的編譯構(gòu)建。
* text=auto
*.bat text eol=crlf
*.sh text eol=lf
2.2 本地機器為 Windows
每位開發(fā)者的本地環(huán)境,通過 .gitconfig 文件設(shè)置行尾,僅影響的是本地開發(fā)環(huán)境,需要每位開發(fā)者自行配置。可能有其他更為優(yōu)秀、妥當(dāng)且不算復(fù)雜的方案,可以避免要求每位開發(fā)者配置本地環(huán)境,但目前對于 Windows 開發(fā)者來說,配置本地環(huán)境還是最為簡單有效的方案。
[core]
autocrlf = true
eol = lf
之所以需要設(shè)置 core.autocrlf=true,是因為對于 Windows 用戶而言,無論文件創(chuàng)建時是 LF 還是 CRLF,都希望拉取到本地時文件能夠適配 Windows 而將 LF 的文件自動轉(zhuǎn)換為 CRLF,當(dāng)然 *.sh 文件除外。
- 而不設(shè)置
core.autocrlf將影響- 文件行尾及文件的一致性,導(dǎo)致本地變更和工作樹、和索引比較時,出現(xiàn)行尾的變更
- 無法保障文件可執(zhí)行性
- 無法保障文件在本地 Windows 和遠端 Linux 能夠正常讀寫,編輯時可能會有編碼問題,出現(xiàn)亂碼
- 或設(shè)置
core.autocrlf=input所表達的和* text=auto理論一致,其會在推送遠端時將行尾轉(zhuǎn)換為 LF,從遠端拉取到本地時會保持文件創(chuàng)建時的原始行尾。造成本身就是 LF 行尾的文件在本地仍然是 LF,不會轉(zhuǎn)換為 CRLF,影響文件在 Windows 系統(tǒng)中的編輯。
之所以要設(shè)置 core.eol=lf,是為了保障倉庫內(nèi)的行尾一致使用 LF,而不是某些文件 LF,某些 CRLF,某些混合。
2.3 本地機器為 Linux / OS X
無需進行 Windows 中所作的配置。
2.4 查看當(dāng)前本地工作樹內(nèi)文件的行尾
# 查看所有文件
git ls-files --eol
# 查找文件行尾中有混合了 LF 和 CRLF 的文件
git ls-files --eol | findstr mixed
git ls-files --eol | grep mixed
# i 表示 index,可以視作遠端行尾
# w 表示 working tree,可以視作本地行尾
### 行尾可能的值有 lf、crlf、mixed,mixed 表示一個文件中行尾既有 lf 又有 crlf,應(yīng)避免 ###
# attr 表示 .gitattributes 中的行尾設(shè)置
# 最后一列是文件名稱,即當(dāng)前執(zhí)行 git ls-files 指令所在目錄下的相對路徑
i/lf w/crlf attr/text=auto .gitattributes
3 行為表現(xiàn)
當(dāng)正確進行了行尾設(shè)置后
- 文件拉取到本地做了行尾轉(zhuǎn)換后,git 并不會認為文件產(chǎn)生了變更,在 git 變更中不會出現(xiàn)新的變更記錄。
- 對于做出常規(guī)變更的文件,git 在將文件與未修改的版本進行比較時,會將本地文件的行尾自動轉(zhuǎn)換為遠端所設(shè)置的行尾再進行比對,不會將行尾的變更納入為實際的變更中來。
行尾的變化對用戶來說將變得無感。
4 其他注意事項
單獨在 .editorconfig 設(shè)置,如所有文件類型或 *.cs 文件類型設(shè)置行尾為 CRLF,并不能夠影響 git 的行為,仍然無法避免 git 將行尾修改識別為常規(guī)變更,并且導(dǎo)致 CRLF 行尾的文件被推送到遠端,在遠端也能夠看到行尾的變更。該設(shè)置僅能夠為 IDE 如 VS 將在保存文件時檢查行尾,將行尾不是 CRLF 的設(shè)置為 CRLF。
5 參考資料
- CRLF vs. LF: Normalizing Line Endings in Git
- .gitattributes Best Practices
- merge.renormalize
- Configuring Git to handle line endings
總結(jié)
以上是生活随笔為你收集整理的Git 行尾设置须知的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 向量数据库Chroma极简教程
- 下一篇: .NET 8 IEndpointRout