Windows git “aviso: LF será substituído por CRLF”, é esse aviso para trás?

147

env:

  • Windows 7
  • msysgit

Quando eu git commitdiz:

warning: LF will be replaced by CRLF. 

Este aviso está atrasado?
Eu edito o arquivo no Windows, o final da linha é CRLF, assim como esta foto:
insira a descrição da imagem aqui
E o git muda para LFpara confirmar o repo.
Então, acho que o aviso correto é:

warning: CRLF will be replaced by LF. 
Honghe.Wu
fonte
2
@ devnull Quero dizer que o aviso é para trás, não é?
Honghe.Wu
@ Honghe.Wu Não, não está no Windows. Eu editei minha resposta abaixo
VonC 13/07/2013
11
Ótima pergunta, porque, de fato, o aviso parece estar atrasado. É realmente confuso receber esse aviso sobre a conversão para CRLF em um commit e nenhuma explicação sobre o manuseio de espaço em branco do Git ajudará, porque o aviso é inverso .
Stijn de Witt
1
@StijndeWitt Gostaria muito de vê-lo comentar como resposta para votá-lo.
user1460043

Respostas:

185

aviso: LF será substituído por CRLF.

Dependendo do editor que você estiver usando, não será necessário salvar um arquivo de texto com LF com o CRLF: editores recentes podem preservar o estilo eol. Mas essa configuração do git insiste em mudar esses ...

Basta certificar-se de que (como eu recomendo aqui ):

git config --global core.autocrlf false

Dessa forma, você evita qualquer transformação automática e ainda pode especificá-las através de um .gitattributesarquivo e core.eoldiretivas .


windows git "LF será substituído por CRLF"
Este aviso está atrasado?

Não: você está no Windows e a git configpágina de ajuda menciona

Use essa configuração se desejar ter CRLFterminações de linha em seu diretório de trabalho, mesmo que o repositório não possua finalizações de linha normalizadas.

Conforme descrito em " git substituindo LF por CRLF ", ele deve ocorrer apenas no checkout (não confirmado), por core.autocrlf=true.

       repo
    /        \ 
crlf->lf    lf->crlf 
 /              \    

Conforme mencionado na Xiaopeng 's resposta , esse aviso é o mesmo que:

aviso: (Se você fizer check-out / ou clonar em outra pasta com a sua core.autocrlfconfiguração atual ), o LF será substituído pelo CRLF.
O arquivo terá suas terminações de linha originais no diretório de trabalho (atual).

Como mencionado na git-for-windows/gitedição 1242 :

Ainda sinto que esta mensagem é confusa, a mensagem pode ser estendida para incluir uma explicação melhor do problema, por exemplo: "LF será substituído pelo CRLF file.jsonapós remover o arquivo e fazer check-out novamente".

Nota: Git 2.19 (setembro de 2018), ao usar core.autocrlf, o aviso falso "LF será substituído por CRLF" agora é suprimido .


Como o quaylar comenta corretamente , se houver uma conversão no commit, é LFsomente.

Esse aviso específico " LF will be replaced by CRLF" vem de convert.c # check_safe_crlf () :

if (checksafe == SAFE_CRLF_WARN)
  warning("LF will be replaced by CRLF in %s.
           The file will have its original line endings 
           in your working directory.", path);
else /* i.e. SAFE_CRLF_FAIL */
  die("LF would be replaced by CRLF in %s", path);

É chamado por convert.c#crlf_to_git(), ele mesmo chamado convert.c#convert_to_git(), ele mesmo chamado por convert.c#renormalize_buffer().

E esse último renormalize_buffer()é chamado apenas por merge-recursive.c#blob_unchanged().

Portanto, suspeito que essa conversão ocorra git commitsomente se o referido commit fizer parte de um processo de mesclagem.


Nota: com o Git 2.17 (Q2 2018), uma limpeza de código adiciona alguma explicação.

Veja commit 8462ff4 (13 Jan 2018) por Torsten Bögershausen ( tboegi) .
(Incorporado por Junio ​​C Hamano - gitster- in commit 9bc89b1 , 13 de fevereiro de 2018)

convert_to_git (): safe_crlf / checksafe torna-se int conv_flags

Ao chamar convert_to_git(), o checksafeparâmetro definiu o que deveria acontecer se a conversão de EOL ( CRLF --> LF --> CRLF) não fizesse uma ida e volta limpa.
Além disso, também definiu se as terminações de linha devem ser renormalizadas ( CRLF --> LF) ou mantidas como estão.

checksafe era um safe_crlfenum com estes valores:

SAFE_CRLF_FALSE:       do nothing in case of EOL roundtrip errors
SAFE_CRLF_FAIL:        die in case of EOL roundtrip errors
SAFE_CRLF_WARN:        print a warning in case of EOL roundtrip errors
SAFE_CRLF_RENORMALIZE: change CRLF to LF
SAFE_CRLF_KEEP_CRLF:   keep all line endings as they are

Observe que uma regressão introduzida em 8462ff4 (" convert_to_git(): safe_crlf/checksafetorna - se int conv_flags", 13/01/2018, Git 2.17.0) no ciclo Git 2.17 fez com que as autocrlfreescritas produzissem uma mensagem de aviso, apesar da configuraçãosafecrlf=false .

Veja commit 6cb0912 (04 Jun 2018) por Anthony Sottile ( asottile) .
(Incorporado por Junio ​​C Hamano - gitster- in commit 8063ff9 , 28 de junho de 2018)

VonC
fonte
1
Sim, a maioria dos editores pode preservar o estilo EOL, mas com a maioria dos editores, isso não tem efeito ao criar um novo arquivo no mesmo projeto. Certifique-se de não fazer o checkout de um projeto LF, pense "psh, meu editor pode lidar com terminações de linha LF, não preciso de autocrlf" e, em seguida, esqueça de definir manualmente novos arquivos como finais de linha LF.
15
@VonC Devo confessar que não estou conseguindo. O Git-Book declara que o Git pode lidar com isso convertendo automaticamente as terminações da linha CRLF em LF quando você confirma e vice-versa quando faz check-out do código no seu sistema de arquivos. Isso significa que, ao confirmar , haverá uma conversão para LF e nunca para CRLF . O que significa que o aviso mencionado está incorreto. Tendo core.autocrlf=trueserá sempre deu em LF no repo, e CRLF no imho árvore de trabalho (mesmo em condições não-Windows). Fonte: link
quaylar,
12
"Este aviso está atrasado? Ele deve ocorrer apenas no checkout" Estou vendo esse aviso exato no commit . Então , sim , é inverso. Estar atrasado me fez procurar por isso. Fico feliz que os outros também! É muito confuso para as pessoas que realmente leem esses avisos vê-lo dizendo que será convertido para CRLF em uma mensagem de confirmação.
Stijn de Witt
7
"Portanto, suspeito que essa conversão ocorra em um commit do git apenas se o commit for parte de um processo de mesclagem." Não. Estou vendo isso em confirmações regulares.
Stijn de Witt
3
A parte que me incomoda sobre a mensagem é que ela aparece. por que preciso ser avisado de que o git está prestes a fazer exatamente o que eu o configurei? Não preciso de um aviso dizendo "ei, ainda estamos convertendo finais de linha para você, como você pediu". Quando o sistema está se comportando de acordo com o design, ele não deve emitir avisos desnecessários ou as pessoas perdem os avisos importantes em um mar de mensagens irrelevantes.
Brent Larsen
27

SIM, o aviso está ao contrário.

E, de fato, nem deveria ser um aviso em primeiro lugar. Porque todo esse aviso está dizendo (mas, infelizmente, para trás) é que os caracteres CRLF no seu arquivo com terminações de linha do Windows serão substituídos pelos LFs no commit. O que significa que é normalizado para as mesmas terminações de linha usadas pelo * nix e pelo MacOS.

Nada de estranho está acontecendo, esse é exatamente o comportamento que você normalmente gostaria.

Esse aviso em sua forma atual é uma das duas coisas:

  1. Um erro infeliz combinado com uma mensagem de aviso excessivamente cauteloso ou
  2. Um enredo muito inteligente para fazer você realmente pensar sobre isso ...

;)

Stijn de Witt
fonte
1
O que é estranho é que, se você converter à força arquivos locais no Windows para LF, nem poderá adicionar os arquivos com git, a mensagem reclamará e anulará sua confirmação.
phpguru
24

- Atualização em 9 de julho ---

Removido "Está correto e preciso", como comentado por @mgiuca

======

NÃO . NÃO está falando sobre seus arquivos atualmente CRLF. Ele está falando sobre arquivos com LF.

Deve ler-se:

aviso: ( Se você fizer check-out / ou clonar em outra pasta com a configuração atual do core.autocrlf ,) o LF será substituído pelo CRLF

O arquivo terá suas terminações de linha originais no seu diretório de trabalho ( atual ).

Esta imagem deve explicar o que isso significa. insira a descrição da imagem aqui

Xiao Peng - ZenUML.com
fonte
1
Bela ilustração. +1. Mencionei sua resposta na minha para obter mais visibilidade.
VonC
O que funciona bem para mim é: 1) core.autocrlf = false 2) no conjunto Intellij, separador de linhas (\ n). Eu uso o Intellij Idea no Mac e no Windows.
Xiao Peng - ZenUML.com
Isso pode acontecer quando o arquivo foi criado no Windows, mas possui uma terminação de linha unix / mac (lf) e sua propriedade gocr config autocrlf é verdadeira. Essencialmente git não vai mudar o arquivo que você criou, mas ele vai verificá-la / clone com janelas finais de linha (por causa de sua configuração autocrlf)
Patrick
1
Como o aviso é correto e preciso se você tiver que qualificá-lo com "Se você fizer check-out / ou clonar para outra pasta com sua configuração atual core.autocrlf". Não é isso que a mensagem original diz. Ele diz que (não poderá) ser substituído pelo CRLF, o que implica que ele será armazenado no modo CRLF no próprio repositório, e não em um check-out futuro hipotético.
mgiuca
12

Tudo isso assume core.autocrlf=true

Erro original:

aviso: LF será substituído por CRLF
O arquivo terá suas terminações de linha originais em seu diretório de trabalho.

O que o erro DEVE ler:

aviso: o LF será substituído pelo CRLF no seu diretório de trabalho
O arquivo terá suas terminações de linha LF originais no repositório git

Explicação aqui :

O efeito colateral dessa conversão conveniente, e é disso que se trata o aviso, é que, se um arquivo de texto que você criou originalmente tiver terminações LF em vez de CRLF, ele será armazenado com LF como de costume, mas quando marcado mais tarde, ele terá terminações CRLF. Para arquivos de texto normais, isso geralmente é bom. O aviso é "para sua informação" nesse caso, mas, caso o git avalie incorretamente um arquivo binário como um arquivo de texto, é um aviso importante porque o git estaria corrompendo seu arquivo binário.

Basicamente, um arquivo local que era anteriormente LF agora terá CRLF localmente

mikew
fonte
7

git config --global core.autocrlf false funciona bem para configurações globais.

Mas se você estiver usando o Visual Studio, também poderá ser necessário modificar .gitattributesalguns tipos de projetos ( por exemplo, aplicativo de biblioteca de classes c # ):

  • remover linha * text=auto
Eric Wang
fonte
1

Depois que eu defini core.autocrlf=true, estava recebendo "LF será substituído por CRLF" (note que não "CRLF será substituído por LF") quando eu estava git adding (ou talvez estivesse ligado git commit?) Arquivos editados nas janelas de um repositório (que usa LF) que foi retirado antes de eu definir core.autocrlf=true.

Fiz um novo check-out core.autocrlf=truee agora não estou recebendo essas mensagens.

Marsette Vona
fonte
0

Se você estiver usando o Visual Studio 2017, 2019, poderá:

  1. abra o arquivo .gitignore principal (atualize ou remova outros arquivos .gitignore em outros projetos da solução)
  2. cole o código abaixo:
[core]
 autocrlf = false
[filter "lfs"]
 required = true
 clean = git-lfs clean -- %f
 smudge = git-lfs smudge -- %f
 process = git-lfs filter-process
Javier Cañon
fonte
1
Esse "código" parece estar em um arquivo de configuração como .gitconfigou .git/config, não .gitignore, que especifica os arquivos a serem ignorados pelo git.
davidA 29/03
Eu adicionei isso ao .git / config, mas ainda "aviso: o CRLF será substituído pelo LF" aparece
Sergei
0

Faça apenas uma coisa simples:

  1. Abra o git-hub (Shell) e navegue até o arquivo de diretório que pertence (cd / a / b / c / ...)
  2. Executar dos2unix (em algum momento dos2unix.exe)
  3. Tente confirmar agora. Se você receber o mesmo erro novamente. Execute todas as etapas acima, exceto em vez do dos2unix, execute o unix2dox (unix2dos.exe em algum momento)
Antriksh Jain
fonte