Dosya öznitelikleri
.gitattributes, git'te neredeyse kimsenin yazmadığı ama en çok değer üreten
dosyadır. Bir deponun git'e kendi içeriğini öğretme yoludur: hangi dosyalar
ikilidir, hangileri çakışmak yerine uç uca eklenmelidir, hangileri bir arşive
hiç girmemelidir, herkes hangi satır sonlarını alacaktır.
Asıl önemli kısım: bu dosya commit'lenir. Eklediğiniz bir kural, depoyu klonlayan herkes için, her işletim sisteminde, kalıcı olarak sorunu çözer — kendi yapılandırmanızdaki bir ayarın aksine; o yalnızca sizi kurtarır ve meslektaşlarınızı aynı sorunu zor yoldan keşfetmeye bırakır.
⌘K → Dosya öznitelikleri.

Kurallar ne işe yarar
| Öznitelik | Neyi düzeltir |
|---|---|
text=auto eol=lf |
Dosyayı kimin checkout ettiğine göre değişip duran satır sonları |
binary |
Git'in bir PSD'yi, bir DOCX'i ya da derlenmiş bir varlığı diff'lemeye veya üç yönlü birleştirmeye çalışması |
merge=union |
Herkesin sonuna ekleme yaptığı ve herkesin çakıştığı bir changelog |
-merge |
Üç yönlü birleştirmenin saçmalık ürettiği dosyalar — kilit dosyaları, üretilmiş kod |
export-ignore |
Bir sürüm arşivinin içine giren CI yapılandırması ve test verileri |
diff=<driver> |
Bir dönüştürücü verildiğinde aslında okunabilir olan biçimlerin okunaksız diff'leri |
filter=lfs |
LFS üzerinden saklanan büyük dosyalar |
linguist-vendored |
Dil istatistiklerinde sizin sayılan, dışarıdan alınmış kod |
binary, -diff -merge -text kısaltmasıdır; yani "bu dosya hakkında tahmin
yürütmeyi bırak" cevabının üçünü birden tek kelimede verir.
Düzenleme
Hazır ayarlar bir desen ile özniteliklerini doldurur; eklemeden önce deseni
düzenleyin — CHANGELOG.md bir öneridir, projeniz hakkında bir kural değil.
Düzenlemeler cerrahidir. Zaten kuralı olan bir desen için kural eklemek, o satırı bulunduğu yerde yeniden yazar; sonradan geldiği için kazanan ikinci bir kural eklemez. Dosyadaki yorumlar olduğu gibi kalır, çünkü bir kuralın yanındaki "neden" genellikle kuralın kendisinden daha değerlidir.
Her kaydetme sıradan bir Gitcito eylemidir: bildirim çıkar ve Geri al dosyayı tam olarak eski hâline döndürür.
Bir depoda birden fazla öznitelik dosyası olabilir. Kök dizinde bir tane,
herhangi bir alt dizinde bir tane ve hiçbir zaman commit'lenmeyen, yalnızca
sizin makinenizde geçerli olan özel bir .git/info/attributes — projeyle değil
sizinle ilgili bir kuralın doğru yeri. Gitcito hepsini listeler ve hangisinin ne
olduğunu söyler.
Bir yola ne uygulanıyor?
Kurallar birden çok dosyadan gelir, daha özgül olan kazanır ve cevabı bulmak
için hepsini okumak tahminden ibarettir. Bir yola ne uygulanıyor?,
git check-attr çalıştırır ve git'in kendi vardığı sonucu gösterir — geçerli
olan tek cevap.
Diff sürücüleri: bir Word belgesini okunabilir kılmak
Bir .docx aslında bir zip'tir. Bir .pdf sıkıştırılmış bir nesne çizgesidir.
Git bunları ne iseler öyle diff'ler — yani gürültü olarak — ve böylece belge
okunabilir olduğu hâlde geçmişi okunmaz olur.
Bir diff sürücüsü bunu textconv ile çözer: dosyayı yalnızca diff için
metne çeviren bir komut. Çalışma dizinindeki dosyaya dokunulmaz; git sadece
dönüştürülmüş metni karşılaştırır.
İki yarısı vardır ve ikisi de gereklidir:
- Git yapılandırmasında
diff.<name>.textconv— dönüştürücü komutu. .gitattributesiçinde*.docx diff=<name>— hangi dosyalara uygulanacağı.
Buradaki düğmeler ikisini birden yapar. Word, Excel, JSON ve .strings için dönüştürücüyü
Gitcito'nun kendisi paketinde getirir — önizlemelerinin kullandığı belge
ayrıştırmanın aynısı, uygulamanın içinde küçük bir gitcito-textconv komutu
olarak sunulur — dolayısıyla bu dördü hiçbir şey kurmadan çalışır. Geri
kalanların hâlâ PATH'inizde gerçek bir araca ihtiyacı vardır: Gitcito bunu
denetler ve eksik olanı soluklaştırır; ilk diff'te başarısız olacak bir sürücü
yazmaz.
| Sürücü | Gereksinimi | Size verdiği |
|---|---|---|
word |
hiçbir şey — Gitcito ile gelir | .docx dosyalarının düzyazı diff'leri |
excel |
hiçbir şey — Gitcito ile gelir | .xlsx/.xls dosyalarının satır bazlı diff'leri (sayfa başına CSV) |
json |
hiçbir şey — Gitcito ile gelir | Anahtara göre sıralanmış, kararlı JSON diff'leri |
strings |
hiçbir şey — Gitcito ile gelir | git'in ikili dediği UTF-16 .strings dosyasının satır farkları |
pdf |
pdftotext (poppler) |
.pdf dosyalarının metin diff'leri |
exif |
exiftool |
Pikseller anlaşılmaz olduğunda bir görselde neyin değiştiği |
iOS projelerini ısıran dosya
Localizable.strings, Xcode'un tarihinin neredeyse tamamında UTF-16'dır ve
UTF-16 NUL baytlarıyla doludur; git de ona ikili der ve hiçbir şey
göstermez:
diff --git a/Localizable.strings b/Localizable.strings
Binary files a/Localizable.strings and b/Localizable.strings differ
Oysa birinin hangi metni oynattığını görmenin en çok önem taşıdığı dosya tam da
budur. strings sürücüsü onu yalnızca fark için çözer — bayt sırası işaretini
varsaymak yerine okuyarak, böylece modern bir UTF-8 .strings bozulmadan geçer,
anlamsız karakterlere dönüşmez.
String Catalog dosyaları (.xcstrings, Xcode 15 ve sonrası) JSON'dur ve json
sürücüsü onları kapsar: anahtarları sıralar, böylece en üste eklenen bir çeviri
farkta bütün dosyayı yeniden yazmayı bırakır.
Paketle gelen dönüştürücünün sınırları, açıkça söylersek: .doc (Word'ün eski
ikili biçimi) anlaşılmaz, yalnızca .docx; PDF kapsanmaz — Gitcito PDF'leri
tarayıcının görüntüleyicisiyle önizler ve yeniden kullanabileceği bir metin
çıkarıcısı yoktur; ayrıca bir belgenin her diff'i kısa bir dönüştürücü başlatma
bedeli öder. git config diff.<name>.cachetextconv true ayarı, git'in çıktıyı
blob başına önbelleğe almasını sağlar.
Dönüştürücü yarısı sizin yapılandırmanızda yaşar, depoda değil — git, bir
klonun size uzattığı komutları çalıştırmaz ve bu, korunmaya değer bir güvenlik
özelliğidir. Paketle gelen sürücüler ayrıca sizin Gitcito kurulum yolunuzu
gösterir; dolayısıyla depoyu klonlayan bir ekip arkadaşınız diff=word
kuralını alır ama kendi dönüştürücüsünü (Gitcito ya da başka bir şey) bağlayana
kadar yine eski okunaksız diff'i görür. Bunu README'nizde belirtin.
Clean/smudge filtreleri — önce bir deneme çalıştırmasıyla
Bir filtre, içeriği depoya girerken ve depodan çıkarken yeniden yazar:
clean hazırlama sırasında (çalışma dizini → depo), smudge checkout
sırasında (depo → çalışma dizini) çalışır. git-lfs böyle çalışır; ekipler de
commit'lenen içerikten kimlik bilgilerini ya da üretilmiş gürültüyü böyle
ayıklar.
Aynı zamanda .gitattributes'ın işaret edebileceği en tehlikeli şeydir: bir
filtre eşleşen her dosyanın her checkout'unda çalışır ve yanlış bir filtre
çalışma dizininizi sessizce bozar. Bu yüzden Gitcito burada düz bir metin
kutusu olmayı reddeder. Bir filtreyi yapılandırmak, deponuzdaki gerçek eşleşen
dosyalara karşı bir deneme çalıştırmasından geçer:
cleankomutu, eşleşen her dosyanın bir kopyası üzerinde çalışır (en fazla beş dosya) — depoda veya yapılandırmasında hiçbir şeye dokunulmaz.- Bir
smudgekomutu verilmişse, temizlenmiş çıktı üzerinde çalıştırılır ve sonuç, özgün dosyayla bayt bayt karşılaştırılır — gidiş-dönüş denetimi. Gidiş-dönüşü tutmayan bir filtre, checkout'un elinizdekini geri getirmeyeceği anlamına gelir. - Kaydet düğmesi ancak tam olarak kaydettiğiniz değerler üzerindeki bir deneme çalıştırmasından sonra etkinleşir. Başarısız olmuş bir deneme çalıştırması — komut hatası, hiçbir eşleşme olmaması ya da farklı bir gidiş-dönüş — yine de kaydedilebilir, ama yalnızca neyin kaybolabileceğini söyleyen açık bir uyarı üzerinden.
Kaydetme, filter.<name>.clean/smudge girdisini yerel git
yapılandırmanıza, filter=<name> kuralını da öznitelik dosyasına yazar ve
yapılandırmanın önceki içeriğini geri getiren bir geri alma kaydı bırakır.
required anahtarı filter.<name>.required ayarını yapar; bu da filtre
bozulduğunda git'in dosyaları sessizce olduğu gibi geçirmek yerine işlemi
başarısız saymasını sağlar.
Sınırlar, açıkça söylersek: deneme çalıştırması, her biri en fazla 5 MB olan en
fazla beş eşleşen dosyayı örnekler ve komut başına 10 saniyelik bir zaman aşımı
uygular — örneklemde uslu duran bir filtre, örneklemin kaçırdığı bir dosyada
yine de yoldan çıkabilir. Komutlar sizin yapılandırmanızda yaşar; dolayısıyla
depoyu klonlayan bir ekip arkadaşınız filter=<name> kuralını alır ama
komutları almaz; onlar olmadan (ve required olmadan) dosyaları değişmeden
geçer.
Bilinmeye değer sınırlar
text=autoneyin commit'lendiğini değiştirir, satır sonlarını girişte normalleştirir. Mevcut bir depoda önce ekleyin, sonra bilinçli olarakgit add --renormalize .çalıştırın — kendine ait tek bir commit içinde.- Öznitelikler geriye dönük işlemez. Bir dosyayı bugün
binaryolarak işaretlemek geçmiş diff'lerinin nasıl saklandığını değiştirmez; yalnızca git'in bundan sonra ona nasıl davranacağını değiştirir. - Kurallar yalnızca dosyanın göründüğü yerde geçerlidir.
design/.gitattributesiçindeki bir kuralsrc/hakkında hiçbir şey söylemez. - Gitcito dosyaların tamamını yazar; bu yüzden elle biçimlendirilmiş bir dosya
biçimiyle birlikte geri gelir — ama Gitcito'nun yeniden yazdığı bir kural,
git'in kanonik
pattern attr attraralığına göre yeniden biçimlendirilir.
Ayrıca bakınız: LFS ve seyrek checkout · Bundle'lar ve arşivler · Merge seçenekleri · Hook'lar