".Gitattributes" dosyasındaki "metin = otomatik" ifadesinin amacı nedir?


129

Çoğunlukla .gitattributesdosyada * text=auto. text=autoO dosyadaki amaç nedir ?

Yanıtlar:


77

Gönderen docs :

Dosyadaki .gitattributes(veya .git/info/attributes) her satır şu şekildedir:

pattern attr1 attr2 ...

Yani burada kalıp, *yani tüm dosyalar anlamına gelir ve öznitelik de olur text=auto.

Ne yapar text=auto? Belgelerden:

Metin "otomatik" olarak ayarlandığında, yol otomatik satır sonu normalleştirme için işaretlenir. Git içeriğin metin olduğuna karar verirse, satır sonları check-in sırasında LF'ye normalleştirilir.

Etkin değilse varsayılan davranış nedir?

belirtilmemiş

Metin özniteliği belirtilmemişse Git, dosyanın dönüştürülmesi gerekip gerekmediğini belirlemek için core.autocrlf yapılandırma değişkenini kullanır.

Ne yapar core.autocrlf? Dokümanlardan:

   core.autocrlf

Bu değişkeni "true" olarak ayarlamak, metin özniteliğini tüm dosyalarda "auto" olarak ayarlamakla hemen hemen aynıdır, ancak metin dosyalarının normalleştirilmesinin garanti edilmemesi gerekir: havuzda CRLF içeren dosyalara dokunulmayacaktır. Depo normalleştirilmiş satır sonlarına sahip olmasa bile çalışma dizininizde CRLF satır sonlarına sahip olmak istiyorsanız bu ayarı kullanın. Bu değişken girdi olarak ayarlanabilir ve bu durumda çıktı dönüşümü yapılmaz.

Bunların çamur kadar açık olduğunu düşünüyorsanız, yalnız değilsiniz.

İşte ne * text=autobenim deyişle yapar: Birisi bir dosyayı işlediğinde, Git bu dosya bir metin dosyası olup olmadığını tahmin ve eğer, tüm CR + LF bayt LF bayt değiştirilir dosyanın bir sürümünü taahhüt edecektir. Dosyaların çalışma ağacında nasıl göründüğünü doğrudan etkilemez, bir dosyayı teslim alırken LF baytlarını CR + LF baytlarına dönüştürecek başka ayarlar da vardır.

Öneri:

Ben ediyorum değil koyarak tavsiye * text=autoiçinde .gitattributesdosyanın. Bunun yerine şuna benzer bir şey tavsiye ederim:

*.txt text
*.html text
*.css text
*.js text

Bu, hangi dosyaların metin dosyaları olduğunu ve nesne veritabanında CRLF'yi LF'ye dönüştüren (ancak çalışma ağacında olması gerekmez) açıkça belirtir. Bir depomuz vardı * text=autove Git bir görüntü dosyası için bunun bir metin dosyası olduğunu tahmin etti ve nesne veritabanındaki CR + LF baytlarını LF baytlarıyla değiştirirken onu bozmasına neden oldu. Bu hata ayıklamak için eğlenceli değildi.

Kullanmanız gerekiyorsa * text=auto, onu ilk satır olarak koyun .gitattributes, böylece sonraki satırlar onu geçersiz kılabilir. Bu giderek daha popüler bir uygulama haline geliyor gibi görünüyor.


2
Neden herkes LF'yi Normal olarak adlandırıyor ama CRLF değil? bunu kanıtlayacak herhangi bir hak var mı?
Yousha Aleayoub

1
@YoushaAleayoub Ne demek istiyorsun?
Flimm

1
@YoushaAleayoub eğer everyoneatıfta bulunuyorsanız git-scm, bunun nedeni muhtemelen bir * nix paketi geliştirmeleridir ve bu nedenle * nix satırsonu karakterini kullanmanın normal olmasıdır .
Justin Moh

4
@YoushaAleayoub LF, "normal" olarak kabul edilir, çünkü birçok geliştirme aracında yaygındır. git-scm* Nix'ten gelme gibi popüler geliştirme araçları . MacOS, LF kullanır. Yalnızca Windows (yalnızca ana akış işletim sistemleri dikkate alınarak) CRLF kullanıyor. Bu, Windows'ta * nix araçlarını kullanan geliştiriciler için ve dosya alışverişi yaparken herkes için işleri zorlaştırır. Ayrıca bkz . Neden CRLF .
Roi Danton

2
@Flimm, *.txt text=autove *.txt textlütfen arasındaki farkı açıklayabilir misin? Yukarıdaki örneğinizdeki 4 satırın tamamının dosya uzantısından sonra text=autoolmaması gerektiğini düşündüm text. Örneğin KiCad ayak izi dosyaları (".kicad_mod" uzantısı), gitattributes dosyasındaki şu satır kullanılarak normalleştirilir: *.kicad_mod text=auto( kicad-pcb.org/libraries/klc/G1.7 ).
Gabriel Staples

64

Satır sonlarının normalleştirilmesini sağlar. Kaynak: Kernel.org

Metin "otomatik" olarak ayarlandığında, yol otomatik satır sonu normalleştirme için işaretlenir. Git içeriğin metin olduğuna karar verirse, satır sonları check-in sırasında LF olarak normalleştirilir.

Satır sonu normalleştirmeyi zorlayan bir kaynak kodu yönetim sistemiyle birlikte çalışmak istiyorsanız veya yalnızca deponuzdaki tüm metin dosyalarının normalleştirilmesini istiyorsanız, bunun yerine tüm dosyalar için metin özniteliğini "otomatik" olarak ayarlamalısınız.

Bu, git'in metin olarak kabul ettiği tüm dosyaların depodaki normalleştirilmiş (LF) satır sonlarına sahip olmasını sağlar.


12
Normalleştirilmiş satır sonu ile ne demek istiyorsun?
Fizer Khan

14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych

11
Bilmeniz önemli, bu, makinenizdeki yerel core.autocrlf ayarının üzerine yazıyor, bu harika yanıtı @Daniel Jomphe tarafından görün
spankmaster79

1
Git, depoya eklenen dosyalardan herhangi biri ile $% # yapmasaydı çok güzel olurdu. SLM, PerForce, MsBuild, Source Depot, TFS, SVM ile çalıştım, bunların hiçbiri dosyalarınızın hiçbirinde bir bayt bile değişmeyecek. Bu sinsi bir git hack IMO'su ve bende çok fazla acıya neden oldu.
Vance McCorkle

1
Ödeme sırasında ne olur, hikayenin sadece yarısıdır - bir alımda ne olur? Ödeme sırasında satır sonlarının LFpencerelerde bile olduğu gibi kaldığını söylemek doğru olur mu?
Anthony

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.