我想在存儲(chǔ)庫(kù)中配置.gitattributes,以解決所有用戶的EOL問題,而無(wú)需更改本地git配置。
我的.gitattributes如下所示:
* text=auto
*.pdf binary
*.xlsx binary
*.png binary
*.jpg binary
在Windows上簽出時(shí),如預(yù)期的那樣,工作樹中的行結(jié)尾為CRLF,索引中的行末尾為L(zhǎng)F:
i/lf w/crlf attr/text=auto sample.tex
然而,Texmaker傾向于在保存時(shí)將tex文件的行尾更改為Unix-style LF,即使沒有發(fā)生實(shí)際更改。因此,在“編輯”之后,工作樹和索引都是LF:
i/lf w/lf attr/text=auto sample.tex
不幸的是,git狀態(tài)現(xiàn)在將顯示文件為臟文件,即使沒有發(fā)生實(shí)際的更改。我該如何解決此問題?
我知道我可以通過(guò)eol=lf強(qiáng)制使用Unix-style結(jié)尾的簽出,但如果其他用戶的編輯器強(qiáng)制使用CRLF,他們可能會(huì)遇到問題。我已經(jīng)設(shè)置了core.autocrlf=true。我不確定這是否會(huì)增加問題。然而,我也想為這個(gè)問題找到一個(gè)通用的(repository-based)解決方案,而不是更改本地配置。
如果這個(gè)文件實(shí)際上已經(jīng)被修改,那么就無(wú)法避免它顯示為已修改。原因是Git使用索引來(lái)保持文件大小和其他數(shù)據(jù),以查看文件是否被修改。如果文件大小發(fā)生變化,Git會(huì)將其標(biāo)記為已修改,即使這不會(huì)導(dǎo)致存儲(chǔ)的blob發(fā)生實(shí)際變化。
原因是索引是一種優(yōu)化,通過(guò)轉(zhuǎn)換機(jī)制作為
git status
的一部分來(lái)處理文件將非常昂貴。例如,如果你有幾個(gè)大文件(比如500 MB)都在使用line-ending轉(zhuǎn)換,你會(huì)花很多時(shí)間執(zhí)行轉(zhuǎn)換,使git status
非常慢。然而,話雖如此,如果你希望你的TeX文件對(duì)所有用戶總是有LF結(jié)尾,你可以這樣做
*.tex text eol=lf
。如果你想對(duì)所有文件使用LF,那將是* text=auto eol=lf
。或者,如果只是針對(duì)您,您可以將
core.eol
調(diào)整為lf
,如下所示:git config --global core.eol lf
(或僅針對(duì)帶有--global
的此repo),這將禁用所有文件的CRLF結(jié)尾。您也可以編輯.git/info/attributes
并放入*.tex text eol=lf
,這將只為TeX文件配置內(nèi)容,并將覆蓋而不是修改存儲(chǔ)庫(kù)中的.gitattributes
。根據(jù)我的經(jīng)驗(yàn),現(xiàn)在大多數(shù)編輯都只能處理LF結(jié)尾,即使是在Windows上,所以這可能是一個(gè)有效的選擇。在許多情況下,要求開發(fā)人員配置他們的編輯器以始終生成LF是合理的,如果你能就這種方法達(dá)成一致,那么用一般的方式解決這個(gè)問題可能會(huì)更容易。