Kokia yra geriausia CRLF (vežimo grąžinimo, linijos) valdymo strategija naudojant „Git“?

Bandžiau padaryti failus su CRLF-galais, bet nepavyko.

Aš visą dieną dirbau savo „Windows“ kompiuteryje, bandydamas naudoti skirtingas strategijas, ir beveik nustebau nustoti bandyti naudoti „Git“ ir bandyti „ Mercurial“ .

Kiekvienam atsakymui pasidalinkite tik viena geriausia praktika.

536
04 окт. pateikė Daniel Jomphe 04 okt. 2008-10-04 23:39 '08 at 11:39 2008-10-04 23:39
@ 9 atsakymai

Beveik ketverius metus po to, kai uždaviau šį klausimą, pagaliau suradau atsakymą, kuris visiškai patenkina mane !

Išsamesnės informacijos ieškokite github: help manual. Dirbkite su linijos pabaiga .

„Git“ leidžia nustatyti linijos pabaigos savybes repo tiesiogiai naudojant teksto atributą .gitattributes . Šis atpirkimo failas ignoruoja pagrindinį.autocrlf nustatymą core.autocrlf leidžiantį visiems užtikrinti nuoseklų elgesį, nepaisant jų git nustatymų.

Ir taip

Šio privalumo yra tai, kad jūsų linijos konfigūracijos pabaiga dabar pereina kartu su saugykla, ir jums nereikia nerimauti, ar bendradarbiai turi teisingus pasaulinius nustatymus.

Čia yra .gitattributes failo pavyzdys

rinkti paruoštas naudoti .gitattributes rinkmenas populiariausioms programavimo kalboms.  Tai naudinga jums pradėti. 

Sukūrę arba .gitattributes savo „ .gitattributes , turite iš naujo normalizuoti eilutės pabaigas.

Atkreipkite dėmesį, kad „ GitHub Desktop“ programa gali pasiūlyti ir sukurti .gitattributes failą atidarius „git repo“ projektą programoje. Norėdami tai išbandyti, spustelėkite įrankio piktogramą (viršutiniame dešiniajame kampe)> Repository Settings ...> Finishes and Line Attributes. Jums bus pasiūlyta pridėti rekomenduojamų „ .gitattributes , o jei sutinkate, programa taip pat normalizuos visus jūsų saugyklos failus.

Galiausiai, atminkite savo linijos pabaigą . suteikia daugiau informacijos ir paaiškina, kaip pavyko išsivystyti šiais klausimais. Manau, kad būtina skaityti.

Jūs tikriausiai turite savo komandos naudotojus, kurie naudoja EGit arba JGit (įrankiai, pvz., „Eclipse“ ir „TeamCity“), kad padarytumėte pakeitimus. Tada jūs nesate laimingi, nes @gatinueta paaiškino šio atsakymo komentarus:

Ši parinktis visiškai netenkins jūsų, jei jūsų komandoje dirbate su „Egit“ ar „JGit“, nes šios priemonės tiesiog ignoruoja .gitattributes ir mielai patikrina CRLF failus https://bugs.eclipse.org/bugs/show_bug.cgi ? id = 342372

Vienas triukas gali būti, kad jie atliktų pakeitimus kitame kliente, tarkim SourceTree . Tada mūsų komanda pasirinko šį įrankį „Eclipse EGit“ daugeliu atvejų atvejais.

Kas sakė, kad programinė įranga yra paprasta?: - /

676
01 июня '12 в 21:56 2012-06-01 21:56 atsakymą pateikė Daniel Jomphe birželio 12 d., 12:56 2012-06-01 21:56

Negalima konvertuoti linijos pertraukų. Tai nėra VCS užduotis duomenų interpretavimui - tiesiog išsaugokite ir grąžinkite. Kiekvienas modernus teksto redaktorius vis tiek gali skaityti abiejų tipų linijų galus.

93
04 окт. atsakymą pateikė John Millikin, spalio 4 d 2008-10-04 23:42 '08 at 23:42 pm 2008-10-04 23:42

Beveik visuomet norite, kad autocrlf=input jei nežinote, ką darote.

Toliau pateikiamas kitas kontekstas:

Tai turėtų būti core.autocrlf=true jei jums patinka DOS Ending arba core.autocrlf=input jei norite naudoti naują „Unix“ liniją. Abiem atvejais jūsų „Git“ saugykloje yra tik LF, kuris yra teisingas dalykas. Vienintelis argumentas dėl core.autocrlf=false buvo tas, kad automatinė heuristika gali neteisingai aptikti kai kuriuos dvejetainius failus kaip tekstą ir tada jūsų plytelė bus sugadinta. Taigi, core.safecrlf buvo įvestas įspėti vartotoją, jei įvyksta negrįžtamas pokytis. Iš tiesų, yra dvi negrįžtamų pokyčių galimybės - mišri eilutė baigiasi tekstiniame faile, šiame normalizavime pageidautina, todėl šis įspėjimas gali būti ignoruojamas arba (labai mažai tikėtina), kad „Git“ neteisingai nustatė jūsų dvejetainį failą kaip tekstą. Tada jums reikia naudoti atributus, kad pasakytumėte, jog šis failas yra dvejetainis.

Pirmiau minėta dalis iš pradžių buvo ištraukta iš srauto gmane.org, bet nuo to laiko ji atėjo.

75
11 июля '09 в 1:36 2009-07-11 01:36 atsakymas pateikiamas Cory liepos 11 d. 09:36 1:36 2009-07-11 01:36

Dvi alternatyvios strategijos, kaip gauti nuoseklius linijų galus mišriose aplinkose („Microsoft + Linux + Mac“):

A. Visuotinis kiekvienam saugyklų įrengimui

1) Viskas konvertuojama į vieną formatą

  find. -type f -not -path "./.git/*" -exec dos2unix {} \; git commit -a -m 'dos2unix conversion' Код> 

2) Nustatykite core.autocrlf ввод Linux / UNIX arba true MS Windowns (repozitoriume arba visame pasaulyje)

  git config - global core.autocrlf input Код> 

3) [Neprivaloma] nustatyti core.safecrlf true (sustabdyti) arba warn (dainuoti), jei norite pridėti papildomą apsaugą, lyginant, ar konversija su naujos eilutės konvertavimu sukelia tą patį failą

  git config --global core.safecrlf true Код> 


B. Arba saugyklų nustatymuose

1) Viskas konvertuojama į vieną formatą

  find. -type f -not -path "./.git/*" -exec dos2unix {} \; git commit -a -m 'dos2unix conversion' Код> 

2) pridėkite .gitattributes failą į savo saugyklą

  echo "* text = auto" >.gitattributes git добавить .gitattributes git commit -m 'добавление .gitattributes для унифицированного окончания строки' Код> 

Nesijaudinkite dėl savo dvejetainių failų - „Git“ turėtų būti pakankamai protingas.


Sužinokite daugiau apie kintamuosius safecrlf / autocrlf

51
26 июня '12 в 4:18 2012-06-26 04:18 atsakymą pateikė „ lukmdo “ birželio 26 d. 12 d. 4:18 2012-06-26 04:18

Pabandykite nustatyti core.autocrlf konfigūracijos core.autocrlf . Taip pat patikrinkite „ core.safecrlf parinktį.

Tiesą sakant, atrodo, kad core.safecrlf gali būti įdiegta jūsų saugykloje, nes (mano pasirinkimas):

Jei tai nėra dabartinės „core.autocrlf“ konfigūracijos atveju, git atmes failą.

Tokiu atveju galite patikrinti, ar jūsų teksto redaktorius yra sukonfigūruotas taip, kad visada naudotų eilutes. Tikriausiai susidursite su problemomis, jei tekstiniame faile yra LF ir CRLF linijų mišinys.

Galiausiai, manau, kad rekomendacija paprasčiausiai „naudoti jūsų suteiktus“ ir naudoti „Windows“ užbaigtas LF linijas sukels daugiau problemų nei išspręs. „git“ turi aukščiau nurodytus parametrus, kad bandytų valdyti liniją protingai, todėl tikslinga juos naudoti.

11
05 окт. atsakymas, kurį pateikė Greg Hewgill 05 spalis 2008-10-05 06:50 '08, 6:50 AM 2008-10-05 06:50

Naudojant core.autocrlf=false sustabdė visus failus, pažymėtus kaip atnaujinti, kai tik juos patikrinau „ Visual Studio 2010“ projekte. Kiti du vystymo komandos nariai taip pat naudoja „Windows“ sistemas, taigi mišri aplinka nebuvo paleista, tačiau numatytieji saugykloje pateikti parametrai visada pažymėjo visus failus, atnaujintus iškart po klonavimo.

Manau, kad apatinėje eilutėje pamatysite, kad CRLF nustatymas veikia jūsų aplinkai. Be to, daugelyje kitų mūsų „Linux“ dėžutės saugyklų autocrlf = true gausite geriausią rezultatą.

Po 20 metų, ir mes vis dar susiduriame su linijiniu neatitikimu tarp OS ... liūdna.

9
16 марта '11 в 6:10 2011-03-16 06:10 atsakymas pateikiamas Lance Cleveland kovo 16 d. 11 val. 10:10 2011-03-16 06:10

Tai du „Windows“ ir „Visual Studio“ naudotojų variantai, kurie naudoja kodą su „Mac“ ar „Linux“ naudotojais. Išsamiau paaiškinkite gitattributes vadovą .

* text = auto

Repo .gitattributes faile pridėkite:

 * text=auto 

Tai normalizuoja visas rinkmenas su repo LF linijų galais.

Ir priklausomai nuo jūsų operacinės sistemos ( core.eol parametras), darbo medžio failai bus normalizuoti į LF Unix pagrindu veikiančioms sistemoms arba CRLF Windows sistemoms.

Tai yra „ Microsoft .NET“ naudojama konfigūracija.

Pavyzdys:

 Hello\r\nWorld 

Bus normalizuotas repo visada kaip:

 Hello\nWorld 

Tikrinant darbo medį „Windows“ bus konvertuojamas į:

 Hello\r\nWorld 

Tikrinant darbo medį „Mac“ išliks toks:

 Hello\nWorld 

Pastaba Jei jūsų repo jau yra failai, kurie nėra normalizuoti, „ git status parodys šiuos failus kaip visiškai pakeitus juos pakeitus, o kitiems vartotojams gali būti skausminga sujungti savo pakeitimus vėliau. Jei norite gauti daugiau informacijos, žr. Atnaujinimo saugyklą .

core.autocrlf = tiesa

Jei text .gitattributes faile nenurodytas, „Git“ naudoja konfigūracijos kintamąjį core.autocrlf kad nustatytų, ar failas turi būti konvertuojamas.

„Windows“ vartotojams git config --global core.autocrlf true yra puiki galimybė, nes:

  • Failai perkeliami į LF linijos galus tik tada, kai jie pridedami prie repo. Jei failai nėra normalizuoti repo, šis parametras jų nepalies.
  • Visi tekstiniai failai konvertuojami į darbo katalogo eilutės CRLF pabaigą.

Šio požiūrio problema yra tokia:

  • Jei esate „Windows“ naudotojas, turintis autocrlf = input , pamatysite eilę failų su LF linijos pabaiga. Tai nėra pavojinga likusiai komandos daliai, nes jūsų įsipareigojimai bus normalizuoti LF linijos pabaigoje.
  • Jei esate „Windows“ naudotojas, turintis „ core.autocrlf = false , pamatysite core.autocrlf = false rinkmenų su LF linijos pabaiga, o jūs galite pateikti rinkmenas su CRLF eilutės CRLF repo.
  • Dauguma „Mac“ naudotojų naudoja „ autocrlf = input ir gali priimti failus su CRLF failo pabaiga, galbūt iš „Windows“ naudotojų, naudojant „ core.autocrlf = false .
5
15 февр. Atsakymas pateikiamas kiewic 15 Feb. 2016-02-15 02:02 '16 at 2:02 am 2016-02-15 02:02

Tai yra problemos sprendimas:

Įprastais atvejais naudokite git. Daugeliu atvejų jie puikiai dirba. Priverstinis LF, jei bendrai naudojate sistemas „Windows“ ir „Unix“, įdiegdami .gitattributes .

Mano atveju buvo 10 programuotojų, rengiančių „Windows“ projektą. Šis projektas buvo išbandytas naudojant CRLF ir nebuvo įmanoma užtikrinti LF naudojimo.

Kai kurie parametrai buvo parašyti mano kompiuteryje be jokios įtakos LF formatui; taigi, kai kurie failai buvo visuotinai pakeisti į LF su visais mažais failų pakeitimais.

Mano sprendimas:

„Windows“ mašinos: leiskite būti. Nesvarbu, nes pagal nutylėjimą esate „Windows“ vienišo vilko kūrėjas ir jūs turite eiti taip: „Pasaulyje nėra jokios kitos sistemos?“

Unix mašinos

  • Į konfigūracijos [alias] skyrių pridėkite šias eilutes. Šioje komandoje išvardijami visi modifikuoti (t. Y. Modifikuoti / nauji) failai:

     unix2dos $(git lc) 
  • Neprivaloma ...

    • Sukurkite git kablys šiam veiksmui automatizuoti.

    • Naudokite parinktis ir įjunkite jį ir pakeiskite „ grep funkciją, kad atitiktų tik tam tikrus failų pavadinimus, pavyzdžiui:

       c2dos = "!f() { unix2dos $(git lc) ; }; f " 

      ... ir paleiskite konvertuojamą medžiagą įvesdami

      5
20 марта '13 в 18:21 2013-03-20 18:21 atsakymą pateikė John Rumpel, kovo 20 d., 13 val., 21:21, 2013-03-20 18:21

Aš praleidau valandas, kad galėčiau kuo geriau panaudoti .gitattributes , kad galiausiai suprasti, kad negaliu pasitikėti.
Deja, tol, kol yra JGit pagrindu veikiančių redaktorių (kurie negali tinkamai tvarkyti .gitattributes ), saugus sprendimas yra priversti LF visur net redaktoriaus lygmeniu.

Naudokite šiuos anti-CRLF dezinfekantus.

--- Atnaujinti ---

Net jei nenorite naudoti pirmiau nurodytos strategijos, jūsų draugas yra ši komanda ( Pastaba: „Windows“ klientams jis veikia tik per „ git-bash ir „Linux“ klientus, tik jei jie yra sukompiliuoti naudojant - su --with-libpcre ./configure ).

 # Print all files that have been committed with CRLF (more correctly that contain CR), so that you normalize them. git grep -I --files-with-matches --perl-regexp '\r' HEAD 

Vienas skausmingas pavyzdys :

„Netbeans 8.2“ („Windows“) klaidingai perduos visus tekstinius failus iš CRLF į repo , jei aiškiai nustatysite „ core.autocrlf kaip visuotinį . Tai prieštarauja „git“ kliento elgesio standartui, o vėliau atnaujinant / sujungiant kyla daug problemų. Tai reiškia, kad kai kurie failai yra skirtingi (nors ir ne), net jei grįžtate .
Tas pats elgesys „netbeans“ atsiranda, net jei prie projekto pridėjote teisingus .gitattributes .

Naudodami pirmiau nurodytą komandą po įsipareigojimo, bent jau padėsite nustatyti, ar jūsų git repozitoriumui bus sunkumų pasibaigus linijai.

1
21 сент. Atsakymas pateikiamas Marinos An 21 sep. 2017-09-21 18:17 '17, 18:17 pm 2017-09-21 18:17

Kiti klausimai apie „ arba „ Klauskite“