--- UPDATE 3 --- (non è in conflitto con UPDATE 2)
Considerando il caso in cui gli utenti di Windows preferiscono lavorare su CRLF
e gli utenti linux / mac preferiscono lavorare su LF
file di testo. Fornire la risposta dal punto di vista di un manutentore del repository :
Per me la strategia migliore (meno problemi da risolvere) è: mantenere tutti i file di testo con LF
repository git interno anche se si sta lavorando su un progetto solo per Windows. Quindi dai la libertà ai clienti di lavorare sullo stile di fine linea delle loro preferenze , a condizione che scelgano un core.autocrlf
valore di proprietà che rispetti la tua strategia (LF su repo) durante la gestione temporanea dei file per il commit.
La stadiazione è ciò che molte persone confondono quando provano a capire come funzionano le strategie newline . È essenziale capire i seguenti punti prima di scegliere il valore corretto per la core.autocrlf
proprietà:
- Aggiungere un file di testo per il commit ( metterlo in scena ) è come copiare il file in un'altra posizione all'interno della
.git/
sottodirectory con le terminazioni di riga convertite (a seconda del core.autocrlf
valore sulla configurazione del client). Tutto questo è fatto localmente.
- l'impostazione
core.autocrlf
è come fornire una risposta alla domanda (esattamente la stessa domanda su tutti i sistemi operativi):
- "Dovrebbe git-client a. Convertire LF-in-CRLF durante il check-out (estrarre) le modifiche al repo dal telecomando o b. Convertire CRLF-in-LF quando si aggiunge un file per commit? " E le possibili risposte (valori) siamo:
false:
" non fare nessuna delle precedenti ",
input:
" fai solo b "
true
: " fai a e eb "
- notare che NON esiste " fare solo un "
per fortuna
- I valori predefiniti del client git (windows
core.autocrlf: true
:, linux / mac:)
core.autocrlf: false
saranno compatibili con la strategia repository solo LF .
Significato : i client Windows verranno automaticamente convertiti in CRLF durante il check-out del repository e convertiti in LF durante l'aggiunta per il commit. E i client Linux per impostazione predefinita non eseguono alcuna conversione. Ciò teoricamente mantiene il tuo repo solo se disponibile.
Purtroppo:
- Potrebbero esserci client GUI che non rispettano il
core.autocrlf
valore git
- Potrebbero esserci persone che non usano un valore per rispettare la tua strategia di lf-repo. Ad esempio, usano
core.autocrlf=false
e aggiungono un file con CRLF per il commit.
Per rilevare file di testo non lf ASAP commessi dai client di cui sopra, è possibile seguire ciò che è descritto su --- update 2 ---: ( git grep -I --files-with-matches --perl-regexp '\r' HEAD
, su un client compilato usando: --with-libpcre
flag)
E qui è il fermo: . Come conservatore del repository, conservo un git.autocrlf=input
modo per poter correggere eventuali file erroneamente impegnati semplicemente aggiungendoli di nuovo per il commit. E fornisco un testo di commit: "Correzione di file con commit errato".
Per quanto .gitattributes
è stato appreso. Non ci conto, perché ci sono più clienti che non lo capiscono. Lo uso solo per fornire suggerimenti per file di testo e binari e forse contrassegnare alcuni file eccezionali che dovrebbero ovunque mantenere le stesse terminazioni di riga:
*.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
Domanda: Ma perché siamo tutti interessati alla strategia di gestione di newline?
Risposta: Per evitare un commit di modifica a una sola lettera, appare come un cambiamento di 5000 righe , solo perché il client che ha eseguito la modifica ha convertito automaticamente il file completo da crlf a lf (o viceversa) prima di aggiungerlo per il commit. Questo può essere piuttosto doloroso quando c'è una risoluzione del conflitto . O potrebbe in alcuni casi essere la causa di conflitti irragionevoli.
--- AGGIORNAMENTO 2 ---
Le impostazioni predefinite del client git funzioneranno nella maggior parte dei casi. Anche se hai solo client Windows, solo client Linux o entrambi. Questi sono:
- windows:
core.autocrlf=true
significa convertire le linee in CRLF al momento del pagamento e convertire le linee in LF quando si aggiungono file.
- linux:
core.autocrlf=input
significa non convertire le linee al momento del checkout (non è necessario poiché i file devono essere impegnati con LF) e convertire le linee in LF (se necessario) quando si aggiungono file. ( - update3 - : sembra che questo sia false
predefinito, ma di nuovo va bene)
La proprietà può essere impostata in diversi ambiti. Suggerirei di impostare esplicitamente l' --global
ambito, per evitare alcuni problemi IDE descritti alla fine.
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
Inoltre scoraggerei fortemente l' uso su Windows git config --global core.autocrlf false
(nel caso in cui tu abbia client solo Windows) in contrasto con quanto proposto per git documentazione . L'impostazione su false impegna i file con CRLF nel repository. Ma non c'è davvero alcun motivo. Non si sa mai se sarà necessario condividere il progetto con utenti Linux. Inoltre è un ulteriore passaggio per ogni client che si unisce al progetto invece di utilizzare i valori predefiniti.
Ora per alcuni casi speciali di file (ad es. *.bat
*.sh
) Che si desidera vengano estratti con LF o con CRLF è possibile utilizzare.gitattributes
Riassumendo per me la migliore pratica è:
- Assicurati che ogni file non binario sia sottoposto a commit con LF su git repo (comportamento predefinito).
- Utilizzare questo comando per assicurarsi che nessun file sia sottoposto a commit con CRLF:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Nota: sui client Windows funziona solo attraverso git-bash
e sui client Linux solo se compilato usando --with-libpcre
in ./configure
).
- Se trovi tali file eseguendo il comando sopra, correggili. Ciò implica (almeno su Linux):
- set
core.autocrlf=input
( --- aggiorna 3 - )
- cambia il file
- annulla la modifica (il file viene ancora mostrato come modificato)
- commettilo
- Usa solo il minimo indispensabile
.gitattributes
- Indicare agli utenti di impostare i
core.autocrlf
valori predefiniti sopra descritti.
- Non contare al 100% sulla presenza di
.gitattributes
. I client git di IDE possono ignorarli o trattarli in modo diverso.
Come detto alcune cose possono essere aggiunte negli attributi git:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
Penso che alcune altre opzioni sicure .gitattributes
invece di utilizzare il rilevamento automatico per i file binari:
-text
(ad es. per *.zip
o *.jpg
file: non saranno trattati come testo. Pertanto non verrà tentata alcuna conversione di fine riga. La diffusione potrebbe essere possibile tramite i programmi di conversione)
text !eol
(ad esempio per *.java
, *.html
:.. trattata come testo, ma la preferenza stile EOL non è impostata in modo viene utilizzata la configurazione del client)
-text -diff -merge
(ad es. per *.hugefile
: non trattato come testo. Nessuna differenza / unione possibile)
--- AGGIORNAMENTO PRECEDENTE ---
Un esempio doloroso di un client che commetterà i file in modo errato:
netbeans 8.2 (su Windows), commetterà erroneamente tutti i file di testo con CRLF, a meno che non sia stato impostato esplicitamente core.autocrlf
come globale . Ciò è in contraddizione con il comportamento standard del client git e causa molti problemi in seguito, durante l'aggiornamento / l'unione. Questo è ciò che rende alcuni file diversi (anche se non lo sono) anche quando si ripristina .
Lo stesso comportamento nei netbeans si verifica anche se hai aggiunto correttamente .gitattributes
al tuo progetto.
L'uso del comando seguente dopo un commit ti aiuterà almeno a rilevare in anticipo se il tuo repository git presenta problemi di fine riga: git grep -I --files-with-matches --perl-regexp '\r' HEAD
Ho trascorso ore a trovare il miglior uso possibile .gitattributes
, per realizzare finalmente, che non posso contare su di esso.
Sfortunatamente, finché esistono editor basati su JGit (che non possono gestire .gitattributes
correttamente), la soluzione sicura è forzare LF ovunque, anche a livello di editor.
Utilizzare i seguenti anti-CRLF
disinfettanti.
.gitattributes
Vuoi condividere Windows ?