Eu li muitas perguntas e respostas diferentes no Stack Overflow, bem como a documentação do git sobre como a configuração core.autocrlf funciona.
Esta é a minha compreensão do que li:
Os clientes Unix e Mac OSX (pré-OSX usam CR) usam terminações de linha LF.
Os clientes Windows usam terminações de linha CRLF.
Quando core.autocrlf é definido como true no cliente, o repositório git sempre armazena arquivos no formato de final de linha LF e os finais de linha em arquivos no cliente são convertidos para frente e para trás no check-out / commit para clientes (ou seja, Windows) que usam não -LF terminações de linha, independentemente do formato dos arquivos de finalização de linha no cliente (isso não concorda com a definição de Tim Clem - veja a atualização abaixo).
Aqui está uma matriz que tenta documentar o mesmo para as configurações 'input' e 'false' do core.autocrlf com pontos de interrogação em que não tenho certeza do comportamento de conversão de final de linha.
Minhas perguntas são:
- Quais devem ser os pontos de interrogação?
- Essa matriz está correta para os "pontos de interrogação"?
Vou atualizar os pontos de interrogação das respostas à medida que o consenso parece ser formado.
valor core.autocrlf entrada verdadeira false -------------------------------------------------- -------- confirmar | converter? ? novo | para LF (converter para LF?) (sem conversão?) confirmar | converter para ? não existente | Conversão LF (converter para LF?) checkout | converter para ? não existente | Conversão CRLF (sem conversão?)
Na verdade, não estou procurando opiniões sobre os prós e contras das várias configurações. Estou apenas procurando dados que deixem claro como esperar que o git opere com cada uma das três configurações.
-
Atualização 17/04/2012 : Depois de ler o artigo de Tim Clem vinculado por JJD nos comentários, modifiquei alguns dos valores nos valores "desconhecidos" na tabela acima, além de alterar "checkout existente | true para converter para CRLF em vez de converter para cliente ". Aqui estão as definições que ele fornece, que são mais claras do que qualquer outra coisa que já vi em outros lugares:
core.autocrlf = false
Esse é o padrão, mas a maioria das pessoas é incentivada a mudar isso imediatamente. O resultado do uso de false é que o Git nunca mexe com as terminações de linha no seu arquivo. Você pode fazer check-in de arquivos com LF ou CRLF ou CR ou alguma mistura aleatória desses três e o Git não se importa. Isso pode dificultar a leitura do diffs e mesclar mais difícil. A maioria das pessoas que trabalha no mundo Unix / Linux usa esse valor porque não possui problemas de CRLF e não precisa que o Git faça um trabalho extra sempre que os arquivos forem gravados no banco de dados do objeto ou gravados no diretório de trabalho.
core.autocrlf = true
Isso significa que o Git processará todos os arquivos de texto e garantirá que o CRLF seja substituído pelo LF ao gravar esse arquivo no banco de dados de objetos e transformar todo o LF novamente no CRLF ao gravar no diretório de trabalho. Essa é a configuração recomendada no Windows, pois garante que seu repositório possa ser usado em outras plataformas, mantendo o CRLF em seu diretório de trabalho.
core.autocrlf = input
Isso significa que o Git processará todos os arquivos de texto e verifique se o CRLF é substituído pelo LF ao gravar esse arquivo no banco de dados do objeto. No entanto, não fará o contrário. Quando você lê os arquivos novamente no banco de dados do objeto e os grava no diretório de trabalho, eles ainda terão LFs para indicar o fim da linha. Essa configuração geralmente é usada no Unix / Linux / OS X para impedir que CRLFs sejam gravados no repositório. A idéia é que, se você colasse o código de um navegador da Web e colocasse CRLFs acidentalmente em um de seus arquivos, o Git garantiria que eles fossem substituídos por LFs quando você escrevesse no banco de dados de objetos.
O artigo de Tim é excelente, a única coisa que consigo pensar é que ele assume que o repositório está no formato LF, o que não é necessariamente verdadeiro, especialmente para projetos somente do Windows.
Comparar o artigo de Tim com a resposta mais votada até o momento por jmlane mostra concordância perfeita com as configurações true e input e discordância com a false false.
fonte
autocrlf
se falso parece muito mais fácil;) stackoverflow.com/questions/2333424/…Respostas:
A melhor explicação de como
core.autocrlf
funciona é encontrada na página de manual gitattributes , natext
seção de atributos.É assim que
core.autocrlf
parece funcionar atualmente (ou pelo menos desde a v1.7.2 do que eu sei):core.autocrlf = true
LF
caracteres são normalizadosCRLF
na sua árvore de trabalho; arquivos que contêmCRLF
no repositório não serão tocadosLF
caracteres no repositório são normalizados deCRLF
paraLF
quando confirmados no repositório. Os arquivos que contêmCRLF
no repositório serão confirmados intocados.core.autocrlf = input
CRLF
caracteres são normalizadosLF
quando confirmados no repositório.core.autocrlf = false
core.eol
determina caracteres EOL nos arquivos de texto da sua árvore de trabalho.core.eol = native
por padrão, o que significa que as EOLs do Windows estãoCRLF
e * nix EOLs estãoLF
em árvores de trabalho.gitattributes
configurações do repositório determinam a normalização de caracteres EOL para confirmações no repositório (o padrão é normalização paraLF
caracteres).Pesquisei apenas recentemente esse problema e também acho a situação muito complicada. A
core.eol
definição definitivamente ajudou a esclarecer como os caracteres de fim de linha são tratados pelo git.fonte
core.autocrlf = false
, se eu não tenho umgitattributes
arquivo, isso significa que não haverá normalização? Ou isso significa que usará a normalização padrão?.gitattributes
arquivo não deve ter precedência sobre acore.autocrlf
configuração?A questão das EOLs em projetos de plataforma mista vem tornando minha vida miserável há muito tempo. Os problemas geralmente surgem quando já existem arquivos com diferentes e mistos EOLs Já no repo. Isso significa que:
CRLF
eLF
no mesmo arquivo.Como isso acontece não é o problema aqui, mas acontece.
Eu executei alguns testes de conversão no Windows para os vários modos e suas combinações.
Aqui está o que eu tenho, em uma tabela ligeiramente modificada:
Como você pode ver, existem 2 casos em que a conversão ocorre no commit (3 colunas à esquerda). No restante dos casos, os arquivos são confirmados como estão.
No checkout (3 colunas à direita), há apenas 1 caso em que a conversão ocorre quando:
core.autocrlf
étrue
eLF
EOL.O mais surpreendente para mim, e suspeito, a causa de muitos problemas de EOL é que não há uma configuração na qual a EOL mista como
CRLF
+LF
seja normalizada.Observe também que os EOLs Mac "antigos" de
CR
apenas nunca são convertidos.Isso significa que, se um script de conversão EOL mal escrito tentar converter um arquivo final misto com
CRLF
s +LF
s, apenas convertendoLF
s paraCRLF
s, ele deixará o arquivo em um modo misto com "solitário"CR
s para ondeCRLF
foi convertidoCRCRLF
.O Git não converterá nada, mesmo no
true
modo, e a destruição do EOL continuará. Isso realmente aconteceu comigo e atrapalhou muito meus arquivos, pois alguns editores e compiladores (por exemplo, VS2010) não gostam de Mac EOLs.Eu acho que a única maneira de realmente lidar com esses problemas é ocasionalmente normalizar todo o repositório, verificando todos os arquivos no modo
input
oufalse
, executando uma normalização adequada e confirmando novamente os arquivos alterados (se houver). No Windows, presumivelmente, retome o trabalhocore.autocrlf true
.fonte
core.autocrlf true
. Pessoalmente, acredito queinput
deve ser usado sempre.As coisas estão prestes a mudar na frente da "conversão de eol", com o próximo Git 1.7.2 :
Uma nova configuração
core.eol
está sendo adicionada / evoluída :Outras evoluções estão sendo consideradas :
O git 2.8 (março de 2016) melhora a maneira como
core.autocrlf
influencia o eol:Ver cometer 817a0c7 (23 de fevereiro, 2016), cometer 6e336a5 , cometer df747b8 , cometer df747b8 (10 de fevereiro de 2016), cometer df747b8 , cometer df747b8 (10 de fevereiro de 2016), e cometer 4b4024f , cometer bb211b4 , cometer 92cce13 , cometer 320d39c , cometer 4b4024f , confirmar bb211b4 , confirmar 92cce13 , confirmar 320d39c (05 de fevereiro de 2016) por Torsten Bögershausen (
tboegi
) .(Mesclado por Junio C Hamano -
gitster
- no commit c6b94eb, 26 de fevereiro de 2016)Como torek acrescenta nos comentários :
Para mais informações, consulte " Qual é a diferença entre autocrlf e eol ".
fonte
core.eol
trata-se de "modificar automaticamente" apenas o que você declara explicitamente em um.gitattributes
arquivo. É diferente docore.autocrlf
que se aplica a qualquer arquivo no repositório. É um processo declarativo.git add
e não nogit commit
momento. (Note-se quegit commit -a
ou--only
ou--include
fazer arquivos adicionar ao índice, nesse momento, no entanto.) Por que vale a pena, você e eu e Linus Torvalds todos odeiam a idéia de um VCS nunca modificar o que está sendo cometido. Mas não são todos aqueles usuários do Windows ... :-)core.autocrlf
O valor não depende do tipo de SO, mas o valor padrão do Windows étrue
e para Linux -input
. Eu explorei 3 valores possíveis para casos de confirmação e verificação e esta é a tabela resultante:fonte
CR
sozinhos nunca são tocados.false
nunca toca nas terminações da linha.true
sempre confirma comoLF
e verifica comoCRLF
. Einput
sempre comete comoLF
e verifica como é.Aqui está o meu entendimento até agora, caso ajude alguém.
core.autocrlf=true
ecore.safecrlf = true
Você tem um repositório onde todas as terminações de linha são iguais , mas você trabalha em plataformas diferentes. O Git garantirá que as terminações de suas linhas sejam convertidas no padrão para sua plataforma. Por que isso importa? Digamos que você crie um novo arquivo. O editor de texto na sua plataforma usará suas terminações de linha padrão. Quando você faz o check-in, se você não tem core.autocrlf definido como true, introduziu uma inconsistência de final de linha para alguém em uma plataforma que usa como padrão um final de linha diferente. Também sempre defino safecrlf porque gostaria de saber que a operação crlf é reversível. Com essas duas configurações, o git está modificando seus arquivos, mas verifica se as modificações são reversíveis .
core.autocrlf=false
Você tem um repositório que já possui finais de linha misturados verificados e corrigir os finais de linha incorretos pode quebrar outras coisas. É melhor não dizer ao git para converter as terminações de linha nesse caso, porque isso exacerbará o problema que foi projetado para resolver - tornando as diferenças mais fáceis de ler e mesclando menos dolorosas. Com essa configuração, o git não modifica seus arquivos .
core.autocrlf=input
Não uso isso porque o motivo é para cobrir um caso de uso em que você criou um arquivo que possui terminações de linha CRLF em uma plataforma que usa como padrão as terminações de linha LF. Prefiro fazer meu editor de texto sempre salvar novos arquivos com os padrões de final de linha da plataforma.
fonte
Não, a resposta @jmlane está errada.
Para
Checkin (git add, git commit)
:text
propriedade forSet, Set value to 'auto'
, a conversão ocorre e o arquivo foi confirmado com 'CRLF'text
propriedade forUnset
: nada acontece, enen paraCheckout
text
propriedade forUnspecified
, a conversão depende decore.autocrlf
autocrlf = input or autocrlf = true
a conversão ocorrer apenas quando o arquivo no repositório for 'LF', se tiver sido 'CRLF', nada acontecerá.autocrlf = false
nada acontecerPara
Checkout
:text
propriedade forUnset
: nada acontece.text
propriedade éSet, Set value to 'auto
: dependecore.autocrlf
,core.eol
.core.eol
text
propriedade éUnspecified
, dependecore.autocrlf
.2.1
2.2
text
propriedade éUnspecified
Comportamento padrão
Portanto, o comportamento padrão é
text
propriedade isUnspecified
ecore.autocrlf = false
:Conclusões
text
propriedade estiver configurada, o comportamento do check-in depende de si mesmo, não do autocrlffonte
Fiz alguns testes no linux e no windows. Eu uso um arquivo de teste contendo linhas que terminam em LF e também que terminam em CRLF.
O arquivo é confirmado, removido e retirado. O valor de core.autocrlf é definido antes da confirmação e também antes da finalização da compra. O resultado está abaixo.
fonte