Como eu forço o git a usar o LF em vez de CR + LF no Windows?

Eu quero forçar git para checkout arquivos no Windows usando apenas LF não CR+LF . Eu verifiquei as duas opções de configuração, mas não consegui encontrar a combinação certa de configurações.

Eu quero converter todos os arquivos para LF e manter o LF nos arquivos.

Observação: Eu usei autocrlf = input mas isso apenas repara os arquivos quando você os confirma. Eu quero forçá-lo a pegá-los usando LF .

Provavelmente eu não estava tão claro: o repository já está usando LF mas os arquivos verificados usando msysgit estão usando CR+LF e eu quero forçar msysgit a obtê-los com LF : forçando terminações de linha Unix .

 >git config --list | grep crlf core.autocrlf=input 

O OP acrescentou em sua pergunta:

os arquivos verificados usando msysgit estão usando CR+LF e eu quero forjar msysgit para obtê-los com LF

Um primeiro passo simples ainda estaria em um arquivo .gitattributes :

 *.txt -crlf 

, para evitar qualquer conversão crlf para arquivos com o eol correto.

Veja Práticas recomendadas para configuração de git entre plataformas?


Mas uma segunda etapa mais poderosa envolve um driver de filtro gitattribute e adiciona um passo de borrão

driver de filtro

Sempre que você atualizar sua tree de trabalho, um script poderá, apenas para os arquivos especificados nos .gitattributes , forçar o LF eol e qualquer outra opção de formatação a ser LF eol .
Se o script ” clear ” não fizer nada, você terá (após commit) transformado seus arquivos, aplicando exatamente o formato que você precisa seguir.

A maneira correta de obter as terminações de LF no Windows é primeiro definir core.autocrlf como false :

 git config --global core.autocrlf false 

Você precisa fazer isso se estiver usando o msysgit, porque ele o define como true nas configurações do sistema.

Agora o git não fará nenhuma linha terminando a normalização. Se você quiser que os arquivos que você .gitattributes sejam normalizados, faça o seguinte: Defina text=auto em seus .gitattributes para todos os arquivos:

 * text=auto 

E defina core.eol para lf :

 git config --global core.eol lf 

Agora você também pode trocar repos simples para crlf (no diretório de trabalho!) Executando

 git config core.eol crlf 

Depois de ter feito a configuração, você pode querer git para normalizar todos os arquivos no repository . Para fazer isso, vá para a raiz do seu repository e execute estes comandos:

 git rm --cached -rf . git diff --cached --name-only -z | xargs -n 50 -0 git add -f 

Se você quiser que o git também normalize os arquivos em seu diretório de trabalho , execute estes comandos:

 git ls-files -z | xargs -0 rm git checkout . 

Volto a esta resposta com bastante frequência, embora nenhuma delas seja completamente certa para mim. Dito isso, a resposta certa para mim é uma mistura dos outros.

O que eu acho que funciona é o seguinte:

  git config --global core.eol lf git config --global core.autocrlf input 

Para os repos que foram retirados depois que as configurações globais foram definidas, tudo será verificado como o que estiver no repo – esperançosamente LF ( \n ). Qualquer CRLF será convertido para apenas LF no check-in.

Com um repository existente que você já fez check-out – que tem as terminações de linha corretas no repository, mas não sua cópia de trabalho – você pode executar os seguintes comandos para corrigi-lo:

 git rm -rf --cached . git reset --hard HEAD 

Isso excluirá ( rm ) recursivamente ( r ) sem prompt ( -f ), todos os arquivos, exceto aqueles que você editou ( --cached ), do diretório atual ( . ). O reset então retorna todos esses arquivos para um estado onde eles têm seus finais de linha verdadeiros (correspondendo ao que está no repo).

Se você precisar consertar os finais de linha de arquivos em um repository, recomendo pegar um editor que permitirá que você faça isso em massa, como IntelliJ ou Sublime Text, mas tenho certeza que qualquer um bom provavelmente suportará isso.

core.autocrlf=input é a configuração correta para o que você quer, mas você pode ter que fazer um git update-index --refresh e / ou um git reset --hard para que a mudança tenha efeito.

Com o core.autocrlf configurado para input , o git não aplicará a conversão de nova linha no check-out (portanto, se você tiver LF no repository, obterá LF), mas garantirá que no caso de você se atrapalhar e apresentar alguns CRLFs na cópia de trabalho de alguma forma, eles não vão entrar no repo.

Contexto

Se vocês

  1. quer forçar todos os usuários a ter finais de linha LF para arquivos de texto e
  2. você não pode garantir que todos os usuários mudem sua configuração git,

você pode fazer isso começando com git 2.10. 2.10 ou posterior é necessário, porque 2.10 corrigiu o comportamento de text = auto junto com eol = lf . Fonte

Solução

Coloque um arquivo .gitattributes na raiz do seu repository git com o seguinte conteúdo:

 * text=auto eol=lf 

Comprometa-se.

Ajustes opcionais

Você também pode adicionar um .editorconfig na raiz do seu repository para garantir que as ferramentas modernas criem novos arquivos com os finais de linha desejados.

 # EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file [*] end_of_line = lf insert_final_newline = true