git LF yerine CRLF koymak


839

Git'i bir Windows XP makinesinde bash kullanarak çalıştırma. Projemi SVN'den ihraç ettim ve daha sonra çıplak bir depoyu klonladım.

Sonra ihracat çıplak depolar dizinine yapıştırdı ve bir yaptım:

git add -A

Daha sonra şu mesajların bir listesini aldım:

LF'nin yerini CRLF alacak

Bu dönüşümün sonuçları nelerdir? Bu, Visual Studio'da bir .NET çözümüdür.


14
@apphacker, çünkü satır sonlarını standartlaştırmak, iki dosyayı ayırırken onları değiştirmek zorunda kalmaktan daha az can sıkıcıdır. (Ve elbette, katılmıyorsanız, core.autocrlf özelliğini kapalı tutabilirsiniz).
RJFalconer

2
satırın tamamına dokunulmadığı sürece satır sonları neden farklı olur
Bjorn

3
Sık sık çok sayıda çizgiye dokunuyorum, çünkü farklı fikirleri deniyorum, nasıl çalıştıklarını görmek için izleme ifadeleri ekliyorum. Sonra sadece iki veya üç satıra bir değişiklik yapmak isteyebilirim ve git diğerlerini tamamen görmezden gelebilirim çünkü onları bulduğum şekilde geri koymuşlardı (ya da öyle düşündüm).
MatrixFrog

5
@ MatrixFrog: düzenleyiciniz bozuk görünüyor, satır sonlarını otomatik olarak algılayamıyor. Hangisi? Bazı LF dosyaları ve bazı aynı CRLF dosyaları aynı repo olması gerekir karma projeler üzerinde çalışıyorum. Herhangi bir modern editör için sorun değil. Editör sınırlamaları etrafında çalışmak için satır sonları ile sürüm kontrolü (veya dosya aktarımı) karışıklığı olması, aşağıdaki açıklamaların sadece uzunluğundan bariz olan en kötü fikirdir.
MarcH

4
Bunun yanlış olduğunu bilen tek modern editör Visual Studio. Visual Studio mutlu bir şekilde LF satır sonları olan bir dosya açar. Daha sonra yeni satırlar eklerseniz, CRLF ekler ve karışık satır sonlarını kaydeder. Microsoft, aksi takdirde oldukça iyi bir IDE üzerinde oldukça büyük bir leke olan bunu düzeltmeyi reddediyor: - (
Jon Watte

Yanıtlar:


956

Bu iletiler, core.autocrlfWindows'taki yanlış varsayılan değerinden kaynaklanıyor .

Kavramı, autocrlfsatır sonları dönüşümlerini şeffaf bir şekilde ele almaktır. Ve öyle!

Kötü haber : değerin manuel olarak yapılandırılması gerekir.
İyi haber : git kurulum başına yalnızca bir kez yapılmalıdır (proje ayarlarına göre de mümkündür).

Nasıl autocrlfçalışır :

core.autocrlf=true:      core.autocrlf=input:     core.autocrlf=false:

        repo                     repo                     repo
      ^      V                 ^      V                 ^      V
     /        \               /        \               /        \
crlf->lf    lf->crlf     crlf->lf       \             /          \      
   /            \           /            \           /            \

Burada crlf= galibiyet stili satır sonu işareti, lf= unix stili (ve mac osx).

(pre-osx crin yukarıdaki üç seçenekten hiçbirinden etkilenmez)

Bu uyarı ne zaman görünüyor (Windows altında)

    - autocrlf= dosyalarınızdan birinde trueunix stiliniz varsa lf(= Nadiren),
    - autocrlf= dosyalarınızdan birinde inputkazanma stiliniz varsa crlf(= neredeyse HER ZAMAN),
    - autocrlf= false- ASLA!

Bu uyarı ne anlama geliyor?

Uyarı " LF CRLF ile değiştirilecektir " Eğer (sahip olduğunu söylüyor autocrlf= trueişlemek-çıkış döngüsü (o pencere tarzı CRLF yerini alacaktır) sonra unix tarzı LF kaybolur). Git, pencerelerin altında unix tarzı LF kullanmanızı beklemiyor.

Uyarı " CRLF LF ile değiştirilecektir " Eğer (sahip olduğunu söylüyor autocrlf= inputa (o Unix tarzı LF ile değiştirilecektir) döngüsü-çıkış tamamlamak sonra windows tarzı CRLF kaybolur). inputPencerelerin altında kullanmayın .

Nasıl autocrlfçalıştığını göstermenin başka bir yolu

1) true:             x -> LF -> CRLF
2) input:            x -> LF -> LF
3) false:            x -> x -> x

burada x ya CRLF (windows tarzı) veya LF (unix tarzı) ve oklar

file to commit -> repository -> checked out file

Nasıl düzeltilir

core.autocrlfGit kurulumu sırasında varsayılan değer seçilir ve sistem genelinde gitconfig ( %ProgramFiles(x86)%\git\etc\gitconfig) içinde saklanır . Ayrıca (aşağıdaki sırayla basamaklı) var:

   - adresinde bulunan "küresel" (kullanıcı başına) gitconfig ~/.gitconfig, henüz başka
   - at "global" (kullanıcı başına) gitconfig $XDG_CONFIG_HOME/git/configveya $HOME/.config/git/configve
   kısmındaki "Yerel" (başına repo) gitconfig - .git/configçalışma dir.

Bu nedenle, git config core.autocrlfşu anda kullanılan değeri kontrol etmek için çalışma dizinine yazın ve

   - eklenti autocrlf=falsesistem genelinde gitconfig # başına sistemine çözümüne
   - git config --global core.autocrlf false            # kullanıcı başına çözüm
   - git config --local core.autocrlf false              # Herbir proje çözümü

Uyarılar
- git configayarlar, gitattributesayarlar tarafından geçersiz kılınabilir .
- crlf -> lfdönüştürme yalnızca yeni dosyalar eklenirken gerçekleşir, crlfdepoda zaten mevcut olan dosyalar etkilenmez.

Ahlaki (Windows için):
    - use core.autocrlf= truebu projeyi Unix altında da kullanmayı planlıyorsanız (ve editör / IDE'nizi unix satır sonlarını kullanacak şekilde yapılandırmak istemiyorsanız),
    - use core.autocrlf= falsebu projeyi yalnızca Windows altında kullanmayı planlıyorsanız ( veya düzenleyicinizi / IDE'nizi unix satır sonlarını kullanacak şekilde yapılandırdıysanız),
    - iyi bir nedeniniz yoksa ( örneğin , pencerelerin altında unix yardımcı programları kullanıyorsanız veya makefiles sorunlarıyla karşılaşıyorsanız) aslacore.autocrlf = kullanmayın ,input

PS Windows için git'i yüklerken ne seçilmeli?
Unix altındaki projelerinizden hiçbirini kullanmayacaksanız , varsayılan ilk seçeneği kabul etmeyin . Üçüncü olanı seçin ( Olduğu gibi ödeme yapın, olduğu gibi işleme koyun ). Bu mesajı görmeyeceksiniz. Hiç.

PPS Benim kişisel tercih yapılandırıyor editör / IDE Unix tarzı uçlarını kullanmaya ve ayar core.autocrlfiçin false.


28
Bu kadar uzun bir süre için harcadığım süre boyunca, bir core.crlf = rackoff ;-)
PandaWood 20:14

10
İçeriği yeniden yapılandırdım, belki bu şekilde okumak daha kolay olacaktır
Antony Hatchkins

7
Üzgünüm, umarım yorumum cevabınıza bir eleştiri olarak alınmamıştır. "Bu kadar ileri gitmek" derken, bu cevabı bulmadan önce.
PandaWood

10
Bu çok kafa karıştırıcı. Editörümde LF ayarlandı. Tüm repo kodu LF kullanır. global autocrlf, false olarak ayarlanır ve ana dizinimdeki çekirdek gitconfig öğesi false olarak ayarlanır. Ama yine de LF'nin CRLF ile değiştirildiğini
görüyorum

17
Düzenleyicinizi Unix stili sonları kullanacak şekilde yapılandırdıysanız, neden core.autocrlfgiriş olarak ayarlanmıyorsunuz ? Cevabınızdan topladığımdan, girdiye ayarlamak, havuzun ve çalışma dizininin daima unix stili satır sonlarına sahip olmasını sağlar. Neden bunu Windows'da asla istemiyorsun?
Hubro

764

Git'in satır sonlarını nasıl ele alacağına dair üç modu vardır:

$ git config core.autocrlf
# that command will print "true" or "false" or "input"

Kullanılacak modu ek bir parametre ekleyerek ayarlayabilirsiniz. truefalseYukarıdaki komut satırına veya .

Eğer core.autocrlf taahhüt içinde onu saklar önce git düşündüğü git repo dosya eklemek her zaman bir metin dosyasıdır araçlarının, sadece LF tüm CRLF satır sonları dönecek, true olarak ayarlanır. Ne zaman bir git checkoutşey yaparsanız , tüm metin dosyaları otomatik olarak LF satır sonlarına CRLF sonlarına dönüştürülür. Bu, bir projenin satır sonlandırma stili her zaman tutarlı bir şekilde LF olduğu için her bir editör satır bitiş stilini değiştirdiğinden, taahhütler olmadan farklı satır sonu stilleri kullanan platformlar arasında bir projenin geliştirilmesine izin verir.

Bu uygun dönüşümün yan etkisi ve gördüğünüz uyarı budur, orijinal olarak yazdığınız bir metin dosyasının CRLF yerine LF sonları varsa, her zamanki gibi LF ile saklanacağı, ancak kontrol edildiğinde daha sonra CRLF sonları olacaktır. Normal metin dosyaları için bu genellikle iyidir. Uyarı bu durumda bir "bilginiz için" dir, ancak git yanlış bir ikili dosyayı bir metin dosyası olarak değerlendirirse, önemli bir uyarıdır çünkü git daha sonra ikili dosyanızı bozar.

Eğer core.autocrlffalse olarak ayarlanır metin dosyaları olduğu gibi teslim edilir, böylece hiçbir satır bitmeyen dönüşüm hiç gerçekleştirilir. Tüm geliştiricileriniz Linux veya tümü Windows'ta olduğu sürece bu genellikle işe yarar. Ancak tecrübelerime göre, yine de karışık satır sonlarına sahip metin dosyaları elde etme eğilimindeyim.

Kişisel tercihim, ayarı bir Windows geliştiricisi olarak AÇIK bırakmaktır.

"Girdi" değerini içeren güncellenmiş bilgiler için http://kernel.org/pub/software/scm/git/docs/git-config.html adresine bakın .


116
Burada da belirtildiği gibi ( stackoverflow.com/questions/1249932/… ), saygıyla katılmıyorum ve bu ayarı KAPALI olarak bırakıyorum (ve Notepad ++ veya herhangi bir son satır karakteri ile başa çıkabileceği ve olduğu gibi bırakabilecek başka bir düzenleyici kullanacağım bulur)
VonC 28:09

23
Bu yanıtı beğendim ve autocrlf değerini true olarak ayarlamayı tercih ediyorum. Alternatif olarak, uyarı mesajlarını otomatik olarak öldürmenin bir yolu var mı?
Krisc

12
core.eolBelki de .gitattributeskonfigürasyonla uyumlu olarak , bu iyi yazılmış cevabı ayarlarla karşılaştırarak arttırmak iyi olurdu . Denemeler yoluyla farklılıkları ve çakışmaları anlamaya çalışıyorum ve bu çok kafa karıştırıcı.
seh

5
Daha kalıcı bir çözüm için .gitconfig'inizi şu şekilde değiştirin: [core] autocrlf = false
RBZ

9
Uyarıyı susturmanın kolay bir yolu var mı? Bunun doğru olmasını istiyorum ve doğru olarak ayarladığımı biliyorum. Tüm uyarıları her zaman
görmem gerekmiyor

159

Kodu zaten kontrol ettiyseniz, dosyalar zaten dizine eklenir. Git ayarlarınızı değiştirdikten sonra şunu söyleyerek çalıştırın:

git config --global core.autocrlf input 

ile dizinleri yenilemelisiniz

git rm --cached -r . 

git git dizinini

git reset --hard

https://help.github.com/articles/dealing-with-line-endings/#refreshing-a-repository-after-changing-line-endings

Not: Bu, yerel değişikliklerinizi kaldıracaktır, bunu yapmadan önce saklamayı düşünün.


23
Yapılandırma anlamı hakkında büyük bir tartışma yerine, basit, platformlar arası, açık bir şekilde DÜZELTME için teşekkür ederiz.
Eris

2
git reset --hard ise yerel değişikliğim kaybolabilir mi? Ben sadece yukarıdaki tüm yorum
metion

5
Evet, yerel değişiklikleriniz kaybolacak. --Hard parametresi, dizin ve çalışma ağacını sıfırlar, böylece izlenen dosyalarda yapılan değişiklikler atılır. git-scm.com/docs/git-reset
Jacques

2
Ne anlama geliyor git rm --cached -r .? Neden git reset --hardyeterli değil?
gavenkoa

2
@gavenkoa @max Gerekir Ayarı değiştirdikten sonra git rm --cached -r .yaparsanız satır sonlarını yeniden dönüştürmez. Git dizinini temizlemeniz gerekir. git reset --hardcore.autocrlf
wisbucky

80
git config core.autocrlf false

6
bu depo kök içinde çalıştırmak emin olun
Hammad Khan

23
Bunun nasıl faydalı olabileceğini anlamıyorum. İnsanların yarısı, autocrlf'nin çalışması için doğru olmasını, diğer yarısının da yanlış / girdi olmasını gerektirir. Peki, bir şey yapışıp sorta "çalışana" kadar bu tek seferlik cevapları konsol duvarlarına rastgele atmaları mı gerekiyor? Bu verimli değil.
Zoran Pavlovic

"Ölümcül: git dizininde değil" hatası alıyorum. C: \ Program Files \ Git ve C: \ Program Files \ Git \ bin
54'te pixelwiz

2
@mbb ayarı autcrlfiçin falseprojenizin her kullanıcıya sadece altı düz kayıklara sorunu.
jpaugh

5
@pixelwiz: Bu komut özelliği yalnızca proje için ayarlar (bu nedenle çalıştırmak için bir git deposunun altında olmanız gerekir). Bunu global olarak ayarlamak istiyorsanız, git config --global core.autocrlf falsebunun yerine kullanın.
Michaël Polla

49

Hem Unix2Dos ve dos2unix gitbash pencereler mevcuttur. UNIX (LF) -> DOS (CRLF) dönüşümünü gerçekleştirmek için aşağıdaki komutu kullanabilirsiniz. Bu nedenle, uyarıyı alamazsınız.

unix2dos filename

veya

dos2unix -D filename

Ancak, bu komutu varolan herhangi bir CRLF dosyasında çalıştırmayın, her ikinci satırda boş satırlar alırsınız.

dos2unix -D filenameher işletim sistemiyle çalışmaz. Lütfen uyumluluk için bu bağlantıyı kontrol edin .

Herhangi bir nedenle komutu zorlamanız gerekiyorsa kullanın --force. Geçersiz yazıyorsa kullanın -f.


8
Bu ne işe yarıyor?
Salman von Abbas

1
Yardım seçeneği şöyle diyor: `- u2d, -D UNIX gerçekleştir - - DOS dönüşümü`
Larry Battle

1
@Rifat kafam karıştı. dos2unix -DYorumunuz, windows satır sonlarını linux satır sonlarına dönüştüreceğini söylüyor . DOS (CRLF) -> UNIX (LF) dönüşümü ile aynı değil. Ancak UNIX (LF) -> DOS (CRLF) dönüşümünü gerçekleştireceğini dos2unix -hbelirtir -D. dos2unix Daha fazla bilgi: gopherproxy.meulie.net/sdf.org/0/users/pmyshkin/dos2unix
Larry Battle

1
@LarryBattle Evet, -D konusunda haklısın. Aslında, ben bir Windows kullanıcısı olduğumda cevap gönderdim. Ve bir mac kullanıcısı olduğumda yorumu bir yıldan fazla bir süre sonra yaptım: D BTW, Açıklama için teşekkürler.
Rifat

1
Bu benim için çalıştı. -D anahtarını desteklemeyen Cygwin kullanıyorum - ama aynı şeyi yapan "unix2dos" komutu var. Keşke soruna neyin sebep olduğunu bilsem - core.autocrlf = false'm var ve bu yalnızca Windows deposudur.
Richard Beier

28

@ Basiloungas'ın yanıtı yakın ama güncel değil (en azından Mac'te).

~ / .Gitconfig dosyasını açın ve safecrlffalse olarak ayarlayın

[core]
       autocrlf = input
       safecrlf = false

Bu * satır sonu karakterini görmezden gelecektir (zaten benim için çalıştı).


1
O olmalı safecrlf(bir 'f' ile)
alpipego

22

Bir satır sonları üzerinde Github makalesi bu konu hakkında konuşurken sık söz edilir.

Sık önerilen core.autocrlfyapılandırma ayarını kullanma konusundaki kişisel deneyimim çok karışıktı.

Windows'u Cygwin ile birlikte kullanıyorum, farklı zamanlarda hem Windows hem de UNIX projeleriyle uğraşıyorum. Windows projelerim bile bazen bashUNIX (LF) satır sonları gerektiren kabuk komut dosyaları kullanır .

GitHub'ın core.autocrlfWindows için önerilen ayarını kullanarak , bir UNIX projesine (Cygwin'de mükemmel bir şekilde çalışır - veya belki de Linux sunucumda kullandığım bir projeye katkıda bulunuyorsam), metin dosyaları Windows ile kontrol edilir (CRLF) ) satır sonları, sorunlar yaratır.

Temel olarak, benim gibi karışık bir ortam için, küresel core.autocrlfolanı seçeneklerden herhangi birine ayarlamak bazı durumlarda iyi çalışmaz. Bu seçenek yerel (depo) git config üzerinde ayarlanmış olabilir, ancak bu hem Windows hem de UNIX ile ilgili şeyler içeren bir proje için yeterince iyi olmaz (örneğin, bazı bashyardımcı program komut dosyalarına sahip bir Windows projem var ).

Bulduğum en iyi seçenek, havuz başına .gitattributes dosyaları oluşturmaktır . GitHub makale bunu bahseder.
Bu makaleden bir örnek:

# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text

# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

Projemin deposundan birinde:

* text=auto

*.txt         text eol=lf
*.xml         text eol=lf
*.json        text eol=lf
*.properties  text eol=lf
*.conf        text eol=lf

*.awk  text eol=lf
*.sed  text eol=lf
*.sh   text eol=lf

*.png  binary
*.jpg  binary

*.p12  binary

Kurmak biraz daha fazla şey, ancak proje başına bir kez yapın ve herhangi bir işletim sistemindeki herhangi bir katılımcı, bu proje ile çalışırken hat sonlarıyla ilgili herhangi bir sorun yaşamamalıdır.


Şimdi bunun içine girerek, diğer temel metin dosyaları arasında Cygwin komut dosyalarıyla bir repo yönetmeye çalışıyor. Uzantısı olmayan dosyaları nasıl ele alırsınız (örn. "Fstab", "sshd_config")? Bağlantılı makale bu senaryoyu kapsamaz.
Mike Loux

1
@MikeLoux Bu yöntemi deneyin: stackoverflow.com/a/44806034/4377192
Gene Pavlovsky

Bunun text=false eol=falsebiraz benzer şekilde çalıştığını gördüm binary. Kulağa doğru geliyor mu? "Bunların metin dosyaları olduğunu biliyorum, ancak normalleştirilmesini istemiyorum" belirtmek yararlı olabilir
joeytwiddle

19

Vim'de dosyayı açın (örneğin:) :e YOURFILEENTER, ardından

:set noendofline binary
:wq

2
Basitçe düzenleme, vimtüm satır sonunu değiştirmeden bırakır.
Göz

Bazı Cocoapods dosyalarıyla bu sorunu yaşıyorum. Yukarıdakilerin çoğu düzeltildi; geri kalanı için s / {control-v} {control-m} // hile yaptı. İki kontrol kodu birlikte, OS X'teki kodların Windows dosyalarında sıkça gördüğü ^ M'yi oluşturur.
janineanne

16

Ben de bu problemi yaşadım.

SVN herhangi bir satır sonu dönüşümü yapmaz, bu nedenle dosyalar CRLF satır sonlarıyla bozulmadan işlenir. Daha sonra projeyi git'e koymak için git-svn komutunu kullanırsanız, CRLF uçları git deposunda kalır, bu da git'in kendisini bulmayı beklediği durum değildir - varsayılan değer yalnızca unix / linux (LF) satır sonlarına sahip olmaktır kontrol edilmiş.

Daha sonra dosyaları Windows'ta kontrol ettiğinizde, autocrlf dönüşümü dosyaları olduğu gibi bırakır (geçerli platform için zaten doğru sonlara sahip oldukları için), ancak teslim edilen dosyalarla bir fark olup olmadığına karar veren işlem ters dönüşümü gerçekleştirir karşılaştırmadan önce , ne düşündüğünü karşılaştırmak, teslim alınan dosyadaki bir LF'nin depoda beklenmeyen bir CRLF ile karşılaştırılmasıyla sonuçlanır.

Bildiğim kadarıyla seçimleriniz:

  1. Git-svn kullanmadan kodunuzu yeni bir git deposuna yeniden içe aktarın, bu satır sonlarının intial git commit --all içinde dönüştürüldüğü anlamına gelir
  2. Autocrlf öğesini false olarak ayarlayın ve satır sonlarının git'in tercih ettiği stilde olmadığı gerçeğini göz ardı edin
  3. Autocrlf kapalıyken dosyalarınızı kontrol edin, tüm satır sonlarını düzeltin, her şeyi tekrar kontrol edin ve tekrar açın.
  4. Orijinal işlemin artık git'in beklemediği CRLF'yi içermemesi için havuzunuzun geçmişini yeniden yazın. (Tarih yeniden yazma ile ilgili olağan uyarılar geçerlidir)

Dipnot: # 2 seçeneğini belirlerseniz, deneyimim, yardımcı araçların bazılarının (rebase, patch vb.) CRLF dosyalarıyla başa çıkmayacağı ve er ya da geç CRLF ve LF (tutarsız çizgi) karışımı olan dosyalarla sonuçlanacaksınız. uçları). İkisinden de en iyi şekilde yararlanmanın bir yolunu bilmiyorum.


2
Geçmişinizi yeniden yazmayı göze alabileceğinizi varsayarak, listenize eklemek için 4. bir seçenek olduğunu düşünüyorum: Git-svn ile başlangıçta oluşturduğunuz bir git repo'yu alabilir ve geçmişini artık CRLF satır beslemelerine sahip olmayacak şekilde yeniden yazabilirsiniz. Bu, tüm svn geçmişiniz boyunca geriye doğru uzanan normalize edilmiş hat beslemelerini verecektir. Keo kullanıcısı stackoverflow.com/a/1060828/64257 adresinde bir çözüm sunuyor .
Chris

Dipnotunuz hakkında: rebaseCRLF ile ilgili bir sorun yok. Bildiğim tek sorun, standart git birleştirme aracının çakışma işaretlerini ("<<<<<<", ">>>>>>") yalnızca LF ile ekleyeceği, böylece çakışma belirteçleri olan bir dosya karışık satır sonlarına sahip. Ancak, işaretleri kaldırdıktan sonra her şey yolunda.
sleske

Git'in kullanımı son 3 yıl içinde değişmiş olabilir, bu benim o zamanki doğrudan deneyimimdi, o zamandan beri bu özel konuyu tekrar gözden geçirmem gerekmiyordu. YMMV.
Tim Abell

1
@sleske start git 2.8, birleştirme işaretleri artık karışık satır sonu tanımayacaktır . Bkz. Stackoverflow.com/a/35474954/6309
VonC

@VonC: Çok güzel. Windows üzerinde çalışmam gereken zamanları bilmek güzel.
sleske

12

Aşağıdakileri ~ / .gitattributes dosyasından kaldırma

* text=auto

git'in ilk etapta satır sonlarını kontrol etmesini engelleyecektir.


6
Yanlış. Bu satır, varsa , core.autocrlf dosyasının yapılandırmasını geçersiz kılar . Bu 'true' değerine ayarlanırsa, hayır, bu satırı kaldırmak git'in satır sonlarını kontrol etmesini engellemez.
Arafangion

1
Bununla birlikte, core.autocrlf olarak ayarlanırsa false, bu kaldırılmazsa autocrlf'nin false olarak ayarlanması çok yardımcı olmaz, bu yüzden bu bana yardımcı oldu (ancak kendi başına yeterli değil).
Matty

2
Bu videoya eklenecek !! "Git'in kontrol edilmesini önleyecek" kısmı teknik olarak doğru olmasa da, bu text=ayardan özellikle bahseden SADECE cevaptır .gitattributes(eğer varsa, bir engelleyici OLACAKTIR). Yani diğer cevaplar eksik. Ben gidiyordu fındık "modifiye" olarak dosyalarım kadar göstermeye devam niçin çalışırken rakam dışarı benim değiştiğini kaç kez olursa olsun autocrlfve safecrlfayarları & teslim & git önbelleği ve donanım sıfırlaması temizledi.
jdunk

10

Bunu şöyle olmalıdır:

uyarı: ( Mevcut çekirdeğinizle başka bir klasöre göz atarsanız / veya kopyalarsanıztrue , LF'nin yerini CRLF alır

Dosya ( geçerli ) çalışma dizininizde orijinal satır sonlarına sahip olacaktır .

Bu resim ne anlama geldiğini açıklamalıdır. resim açıklamasını buraya girin


Ayrıca Subversion'a gönderilen öğenin (bunu yaparsanız) dönüşüme sahip olacağı anlamına gelir.
jpaugh

10

http://www.rtuin.nl/2013/02/how-to-make-git-ignore-different-line-endings/

echo "* -crlf" > .gitattributes 

Bunu ayrı bir işlemde yapın veya git, tek bir değişiklik yaptığınızda tüm dosyaları değiştirilmiş olarak görebilir (autocrlf seçeneğini değiştirip değiştirmediğinize bağlı olarak)

Bu gerçekten işe yarıyor. Git, karma hat bitirme projelerinde hat sonlarına saygı gösterecek ve sizi bunlar hakkında uyarmayacaktır.


2
Bu, özellikle CRLF ve LF arasında dönüştürmek istediğinizde yararlıdır, ancak sağlam kalması gereken birkaç .sh dosyanız var. Her *.sh -crlfzaman kullanıyorum ...
MartinTeeVarga

9

Windows'ta git hakkında çok şey bilmiyorum, ama ...

Bana git'in çalışan formatın (Windows) formatına uyması için dönüş formatını dönüştürdüğü anlaşılıyor. CRLF, Windows'ta varsayılan dönüş biçimidir, LF ise diğer işletim sistemlerinin çoğu için varsayılan dönüş biçimidir.

Büyük olasılıkla, kod başka bir sisteme taşındığında dönüş biçimi düzgün şekilde ayarlanır. Ben de git, örneğin JPEG'lerde LF'leri CRLF'lere dönüştürmeye çalışmak yerine ikili dosyaları sağlam tutacak kadar akıllı olduğunu düşünüyorum.

Özetle, bu dönüşümden çok fazla endişelenmenize gerek yoktur. Ancak, projenizi bir tarball olarak arşivlemeye giderseniz, diğer kodlayıcılar muhtemelen CRLF yerine LF hat sonlandırıcılarına sahip olmaktan memnun olacaktır. Ne kadar önemsediğinize bağlı olarak (ve Not Defteri'ni kullanmamanıza bağlı olarak), eğer mümkünse git'i LF iadelerini kullanacak şekilde ayarlamak isteyebilirsiniz :)

Ek: CR, ASCII kodu 13, LF, ASCII kodu 10'dur. Bu nedenle, CRLF iki bayt, LF birdir.


5
Kimse bunu söylememiş gibi göründüğünden, CR "Satır Başı" ve LF "Hat Beslemesi" anlamına gelir. İkinci bir not olarak, birçok Windows editör sessizce bir metin dosyasını sessizce değiştirir, bunun yerine LF karakteri bir satırsonu yerine CRLF karakterini belirtir. Editörün kullanıcısı uyarılmayacak, ancak Git değişikliği görecek.
user2548343

7

En son git'i yüklediğinizden emin olun. Git (sürüm 2.7.1) kullanıldığında
yukarıdaki git config core.autocrlf falsegibi yaptım, ama işe yaramadı.
O zaman şimdi git git (2.7.1'den 2.20.1'e) olduğunda çalışır.


Sanırım git 2.17.1'e sahipsin demek istedin. Aynı sorunu yaşıyordum ve güncellemeyi yaptım ve bu da düzeltildi. Cevabınızı gördüğüme sevindim!
Phillip McMullen

5
  1. Dosyayı Notepad ++ ile açın.
  2. Düzenle / EOL Dönüşümüne gidin.
  3. Windows Formatına tıklayın.
  4. Dosya 'yı kaydet.

1
Ayrıca git config --global core.autocrlf falseGit'in satır sonlarını Unixbir taahhütte ayarlamasını önlemek için kullanmayı deneyin . git config core.autocrlfGerçekten yanlış olup olmadığını kontrol etmek için takip edin.
Contango

5

OP sorusu windows ile ilgili ve ben dizine gitmeden veya yönetici işe yaramadı olarak Notepad ++ bile dosya çalıştırmadan başkalarını kullanamadı. Bu yüzden bu yolu gitmek zorunda kaldı:

C:\Program Files (x86)\Git\etc>git config --global core.autocrlf false

3

Birçok metin düzenleyici, değiştirmenize izin verir LF, aşağıdaki Atom talimatlarına bakın. Basit ve açık.


CRLFSağ alt kısma tıklayın :

resim açıklamasını buraya girin

LFÜst taraftaki açılır menüden seçin :

resim açıklamasını buraya girin


2

GNU / Linux kabuk isteminde, dos2unix & unix2dos komutları MS Windows'dan gelen dosyalarınızı yavaşça dönüştürmenizi / biçimlendirmenizi sağlar


2

CRLF, iki farklı işletim sisteminde (Linux ve Windows) "kodunuzu" kullanırken bazı sorunlara neden olabilir. Python betiğim Linux docker kapsayıcısına yazılmış ve sonra Windows git-bash kullanılarak aktarılmıştır. Bana LF'nin yerini CRLF alacağı uyarısı verdi. Çok düşünmedim ama senaryoya daha sonra başladığımda, dedi /usr/bin/env: 'python\r': No such file or directory. Şimdi \rsenin için bir yaklaştırma için. Windows, "CR" - satır başı - '\ n' üstünde yeni satır karakteri olarak - kullanıyor \n\r. Bu dikkate almanız gerekebilecek bir şey.


0

Windows'taki araçların çoğu metin dosyalarında yalnızca LF'yi kabul eder. Örneğin, '.editorconfig' adlı bir dosyada Visual Studio'nun davranışını aşağıdaki örnek içerikle (bölüm) kontrol edebilirsiniz:

 indent_style = space
 indent_size = 2
 end_of_line = lf    <<====
 charset = utf-8

Sadece orijinal Windows Not Defteri LF ile çalışmaz, ancak daha uygun bazı basit editör araçları vardır!

Bu nedenle, Windows'taki metin dosyalarında da LF kullanmalısınız. Bu benim mesajım, şiddetle tavsiye edilir! Windows'ta CRLF kullanmak için bir sebep yok!

(Aynı tartışma C / ++ 'daki path'lerde \ kullanıyor, saçmalık, eğik çizgi ile #include <pathTo / myheader.h> kullanın !, C / ++ standardıdır ve tüm microsoft derleyiciler bunu destekler).

Dolayısıyla git için doğru ayar

git config core.autocrlf false

Mesajım: dos2unix ve unix2dos gibi eski düşünme programlarını unutun. Ekibinizde LF'nin Windows altında kullanmaya uygun olduğunu açıklayın.

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.