--- GÜNCELLEME 3 --- (GÜNCELLEME 2 ile çakışmaz)
Windows kullanıcılarının üzerinde çalışmayı tercih ettikleri CRLF
ve linux / mac kullanıcılarının LF
metin dosyaları üzerinde çalışmayı tercih ettikleri dikkate alındığında . Yanıtın bir depo bakımcısı bakış açısından sağlanması :
Benim için en iyi strateji (çözmek için daha az sorun): sadece Windows projesinde çalışıyor olsanız bile tüm metin dosyalarını LF
git repo ile saklayın . Daha sonra , dosyaları taahhüt için hazırlarken stratejinize (repoda LF) saygı duyacak bir özellik değeri seçmeleri koşuluyla , müşterilere tercihlerinin satır sonu stili üzerinde çalışma özgürlüğü verin .core.autocrlf
Evreleme , yeni hat stratejilerinin nasıl çalıştığını anlamaya çalışırken birçok kişinin kafasını karıştırır . Mülkiyet için doğru değeri seçmeden önce aşağıdaki noktaları anlamak önemlidir :core.autocrlf
- Taahhüt için bir metin dosyası eklemek ( hazırlama ) dosyayı dönüştürülmüş satır sonlarıyla
.git/
alt dizin içindeki başka bir yere kopyalamak gibidir ( istemci yapılandırmanızdaki değere bağlı olarak ). Bütün bunlar yerel olarak yapılır .core.autocrlf
- ayar soruya
core.autocrlf
bir cevap vermek gibidir (tüm işletim sistemlerinde aynı soru):
- "Git istemcisi olmalı a. Repo değişikliklerini uzaktan kontrol ederken (çekerek) LF-CRLF'ye dönüştürmeli mi, b. Kesinleştirme için bir dosya eklerken CRLF-LF'yi dönüştürmeli mi? " Ve olası cevaplar (değerler) şunlardır:
false:
" yukarıdakilerin hiçbirini yapma ",
input:
" Do yalnızca b "
true
: " Do a ve b ve "
- HAYIR olduğunu unutmayın " sadece bir "
neyse ki
- git istemci varsayılanları (windows:,
core.autocrlf: true
linux / mac
:) salt LF repo stratejisi core.autocrlf: false
ile uyumlu olacaktır .
Anlamı : Windows istemcileri, depoyu teslim alırken varsayılan olarak CRLF'ye ve kesinleştirme için eklerken LF'ye dönüştürür. Ve linux istemcileri varsayılan olarak herhangi bir dönüşüm yapmaz. Bu teorik olarak sadece repo'nuzu korur.
Ne yazık ki:
- Git'e uymayan GUI istemcileri olabilir
core.autocrlf
değerine
- Lf-repo stratejinize saygı göstermek için değer kullanmayan insanlar olabilir. Örneğin kullanıyorlar
core.autocrlf=false
, taahhüt için CRLF ile bir dosya ve eklerler.
Yukarıdaki istemciler tarafından taahhüt edilen ASAP lf olmayan metin dosyalarını tespit etmek için --- update 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEAD
, kullanılarak derlenen bir istemcide açıklananları takip edebilirsiniz :--with-libpcre
flag
Ve burada tutmak: . Bir repo bakımcısı olarakgit.autocrlf=input
ben sadece taahhüt için tekrar ekleyerek yanlış taahhüt dosyaları düzeltmek bir . Ve bir taahhüt metni sağlıyorum: "Yanlış taahhüt edilen dosyaları düzeltme".
Bildiğim kadarıyla .gitattributes
. Buna güvenmiyorum, çünkü anlamayan daha fazla kullanıcı arayüzü var. Ben sadece metin ve ikili dosyalar için ipuçları sağlamak için kullanabilirsiniz ve belki de her yerde aynı satır sonlarını tutmak gerekir bazı istisnai dosyaları bayrak:
*.java text !eol # Don't do auto-detection. Treat as text (don't set any eol rule. use client's)
*.jpg -text # Don't do auto-detection. Treat as binary
*.sh text eol=lf # Don't do auto-detection. Treat as text. Checkout and add with eol=lf
*.bat text eol=crlf # Treat as text. Checkout and add with eol=crlf
Soru: Peki neden newline taşıma stratejisiyle ilgileniyoruz?
Yanıt: Tek harfli bir değişiklik taahhüdünden kaçınmak için, 5000 satırlık bir değişiklik olarak görünün, çünkü değişikliği gerçekleştiren istemcinin taahhüt için eklemeden önce tam dosyayı crlf'den lf'ye (veya tersine) otomatik olarak dönüştürmesi. Bu , bir uyuşmazlık çözümü söz konusu olduğunda oldukça acı verici olabilir . Veya bazı durumlarda mantıksız çatışmaların nedeni olabilir.
--- GÜNCELLEME 2 ---
Git istemcisinin kusurları çoğu durumda çalışacaktır. Yalnızca pencereleriniz olsa bile, yalnızca linux istemcileri veya her ikisi de. Bunlar:
- windows:
core.autocrlf=true
satırları çıkışta CRLF'ye ve satırları dosya eklerken LF'ye dönüştürmek anlamına gelir.
- linux:
core.autocrlf=input
satırları ödeme sırasında dönüştürmemeniz (dosyaların LF ile işlenmesi beklendiğinden gerek yoktur) ve dosya eklerken satırları LF'ye (gerekirse) dönüştürmek anlamına gelir. ( - update3 - : Bunun false
varsayılan olarak olduğu görülüyor , ancak yine de iyi)
Tesis farklı kapsamlarda ayarlanabilir. --global
Sonunda açıklanan bazı IDE sorunlarından kaçınmak için açıkça kapsamda ayarlanmasını öneririm .
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
Ayrıca şiddetle ediyorum vazgeçirmek kullanarak pencerelerde git config --global core.autocrlf false
(eğer pencereler sadece istemcilerin var) önerilmiştir neyi aksine git belgeler . False değerine ayarlamak, depoda CRLF bulunan dosyaları yürütür. Ama gerçekten bir sebep yok. Projeyi linux kullanıcılarıyla paylaşmanız gerekip gerekmediğini asla bilemezsiniz. Ayrıca, varsayılanları kullanmak yerine projeye katılan her müşteri için ek bir adımdır.
Şimdi *.bat
*.sh
, LF veya CRLF ile teslim alınmasını istediğiniz bazı özel durumlarda (örn. ) Kullanabilirsiniz..gitattributes
Özetlemek gerekirse en iyi uygulama :
- Her ikili olmayan dosyanın git repo'da LF ile işlendiğinden emin olun (varsayılan davranış).
- CRLF ile hiçbir dosyanın işlenmediğinden emin olmak için bu komutu kullanın:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Not: Windows istemcilerinde yalnızca git-bash
linux istemcileri aracılığıyla ve üzerinde çalışır --with-libpcre
../configure
).
- Yukarıdaki komutu uygulayarak bu tür dosyaları bulursanız, bunları düzeltin. Bu aşağıdakileri içerir (en azından linux'da):
- set
core.autocrlf=input
( --- güncelleme 3 - )
- dosyayı değiştir
- değişikliği geri al (dosya hala değişmiş olarak gösterilir)
- taahhüt et
- Yalnızca minimum değeri kullanın
.gitattributes
- Kullanıcılara
core.autocrlf
yukarıda açıklananları varsayılan değerlerine ayarlamalarını söyleyin.
- Varlığında% 100 saymayın
.gitattributes
. IDE'lerin git-istemcileri onları görmezden gelebilir veya onlara farklı davranabilir.
Söylendiği gibi git özelliklerine bazı şeyler eklenebilir:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
.gitattributes
İkili dosyalar için otomatik algılama kullanmak yerine diğer bazı güvenli seçenekleri düşünüyorum :
-text
(örneğin *.zip
veya *.jpg
dosyalar için: Metin olarak ele alınmaz. Dolayısıyla satır sonu dönüşüm denenmez. Dönüşüm programları aracılığıyla fark olabilir)
text !eol
(örn için *.java
, *.html
:.. metin olarak tedavi ancak eol tarzı tercihi ayarlanmamış istemci ayarı kullanılır Yani)
-text -diff -merge
(örneğin *.hugefile
: Metin olarak değerlendirilmez. Fark / birleştirme mümkün değildir)
--- ÖNCEKİ GÜNCELLEME ---
Bir acı örnek dosyaları yanlış taahhüt edecektir bir müşterinin:
netbeans 8.2 (pencerelerde), yanlış ile tüm metin dosyaları taahhüt edecektir sürece, CRLFlerin sen gelmiş açıkça belirlenen core.autocrlf
küresel olarak . Bu, standart git istemci davranışıyla çelişir ve daha sonra güncelleme / birleştirme sırasında birçok soruna neden olur. Geri döndüğünüzde bile bazı dosyaların farklı görünmesine (olmamasına rağmen) budur .
Netbeans'de aynı davranış , projenize doğru bir şekilde eklemiş olsanız bile gerçekleşir .
.gitattributes
Bir taahhütten sonra aşağıdaki komutu kullanmak, en azından git repo'nuzda satır sonu sorunları olup olmadığını erken tespit etmenize yardımcı olacaktır: git grep -I --files-with-matches --perl-regexp '\r' HEAD
Ona .gitattributes
güvenemeyeceğimin mümkün olan en iyi şekilde kullanılması , sonunda fark edilmesi için saatler geçirdim .
Ne yazık ki, JGit tabanlı editörler ( .gitattributes
doğru şekilde işleyemeyen ) var olduğu sürece , güvenli çözüm, LF'yi editör düzeyinde bile her yerde zorlamaktır.
Aşağıdaki anti-CRLF
dezenfektanları kullanın .
.gitattributes
misiniz?