Eu tenho um repositório git hospedado no github. Muitos dos arquivos foram desenvolvidos inicialmente no Windows e eu não tomei muito cuidado com as terminações de linha. Quando realizei a confirmação inicial, também não havia nenhuma configuração git para impor finais de linha corretos. O resultado é que eu tenho vários arquivos com terminações de linha CRLF no meu repositório do github.
Agora estou desenvolvendo parcialmente no Linux e gostaria de limpar os finais de linha. Como garantir que os arquivos sejam armazenados corretamente com o LF no github e tenham o LF na minha cópia de trabalho?
Eu configurei um .gitattributes
arquivo contendo text eol=LF
; isso está correto? Com isso comprometido e empurrado, posso apenas reposicionar rm
meu local e clonar novamente no github para obter o efeito desejado?
Respostas:
Sem um pouco de informação sobre quais arquivos estão no seu repositório (código fonte puro, imagens, executáveis, ...), é um pouco difícil responder à pergunta :)
Além disso, considerarei que você deseja padronizar o LF como finais de linha no seu diretório de trabalho, porque deseja garantir que os arquivos de texto tenham finais de linha LF no seu repositório .git, independentemente de trabalhar no Windows ou Linux . Realmente melhor prevenir do que remediar ....
No entanto, há uma alternativa melhor: Beneficie-se das terminações da linha LF na sua área de trabalho Linux, das terminações da linha CRLF na sua extremidade da linha de trabalho do Windows E LF no seu repositório.
Como você está trabalhando parcialmente no Linux e no Windows, verifique se
core.eol
está definido comonative
ecore.autocrlf
está definido comotrue
.Em seguida, substitua o conteúdo do seu
.gitattributes
arquivo pelo seguinteIsso permitirá que o Git lide com a conversão de terminações de linha automática para você, em confirmações e check-outs. Os arquivos binários não serão alterados, os arquivos detectados como arquivos de texto verão as terminações das linhas convertidas em tempo real.
No entanto, como você conhece o conteúdo do seu repositório, você pode ajudar o Git e ajudá-lo a detectar arquivos de texto de arquivos binários.
Desde que você trabalhe em um projeto de processamento de imagem baseado em C, substitua o conteúdo do seu
.gitattributes
arquivo pelo seguinteIsso garantirá que os arquivos cuja extensão seja c, h ou txt sejam armazenados com finais de linha LF no seu repositório e terão finais de linha nativos no diretório de trabalho. Arquivos JPEG não serão tocados. Todos os outros se beneficiarão da mesma filtragem automagica, como visto acima.
Para obter uma compreensão mais profunda dos detalhes internos de tudo isso, sugiro que você mergulhe neste post muito bom "Cuidado com o fim da sua linha", de Tim Clem, um Githubber.
Como um exemplo do mundo real, você também pode dar uma olhada nesse commit, onde essas alterações em um
.gitattributes
arquivo são demonstradas.ATUALIZAÇÃO para a resposta considerando o seguinte comentário
Faz sentido. Obrigado pelo esclarecimento. Nesse contexto específico, o
.gitattributes
arquivo por si só não será suficiente.Execute os seguintes comandos no seu repositório
Como seu repositório é compartilhado entre o ambiente Linux e Windows, isso atualizará o arquivo de configuração local para ambos os ambientes.
core.eol
garantirá que os arquivos de texto tenham finais de linha LF nos caixas.core.autocrlf
garantirá que a CRLF em potencial nos arquivos de texto (resultantes de uma operação de copiar / colar, por exemplo) seja convertida em LF no seu repositório.Opcionalmente, você pode ajudar o Git a distinguir o que é um arquivo de texto criando um
.gitattributes
arquivo que contenha algo semelhante ao seguinte:Se você decidiu criar um
.gitattributes
arquivo, confirme-o .Por fim, certifique-se de
git status
mencionar "nada a confirmar (diretório de trabalho limpo)" e execute a seguinte operaçãoIsso recriará seus arquivos em seu diretório de trabalho, levando em consideração suas alterações de configuração e o
.gitattributes
arquivo e substituindo qualquer potencial CRLF negligenciado em seus arquivos de texto.Uma vez feito isso, todos os arquivos de texto em seu diretório de trabalho
git status
exibem terminações de linha LF e ainda devem considerar a área de trabalho limpa.fonte
vi
fica menos satisfeito com o CRLF. Eu só quero alterá-lo para quecore.autocrlf
sejafalse
(ouinput
)?git checkout-index --force --all
pode funcionar melhor. O segundo ponto parece um pouco fora do tópico em relação à pergunta original. Que tal fazer uma pergunta dedicada?text
eeol=lf
obter o mesmo resultado descrito em sua resposta por meio decore.eol
ecore.autocrlf
?git checkout-index --force --all
não faz nada por mim. O que funciona é a lista de comandos nas instruções do GitHub para lidar com esse problema.A partir do git 2.10 (lançado em 09/09/2016), não é necessário enumerar cada arquivo de texto separadamente. O Git 2.10 corrigiu o comportamento de text = auto junto com eol = lf . Fonte .
.gitattributes
arquivo na raiz do seu repositório git:Adicione e confirme.
Depois, você pode seguir as etapas e todos os arquivos estão normalizados agora:
Fonte: Resposta de kenorb .
fonte
Para forçar terminações de linha LF para todos os arquivos de texto, você pode criar um
.gitattributes
arquivo no nível superior do seu repositório com as seguintes linhas (altere conforme desejado):que garante que todos os arquivos que o Git considera como arquivos de texto tenham
LF
finalizações de linha normalizadas ( ) no repositório (normalmente acore.eol
configuração controla qual você possui por padrão).Com base nas novas configurações de atributo, todos os arquivos de texto que contêm CRLFs devem ser normalizados pelo Git. Se isso não acontecer automaticamente, você poderá atualizar um repositório manualmente após alterar as terminações de linha, para verificar novamente e confirmar o diretório de trabalho seguindo as seguintes etapas (dado diretório de trabalho limpo):
ou conforme os documentos do GitHub :
Veja também: @Charles Bailey post .
Além disso, se você deseja excluir qualquer arquivo para não ser tratado como texto, desative o atributo de texto, por exemplo,
Ou marque-o explicitamente como binário:
Para ver um arquivo de normalização git mais avançado, verifique
.gitattributes
no núcleo do Drupal :Veja também:
fonte
text=auto
é enganoso. Você não pode usartext=auto
eeol
juntos. A configuraçãoeol
desativa a detecção automática de arquivos de texto. É por isso que você precisa especificar todos esses tipos de arquivos. Seauto
estivesse ativado, você não precisaria de tudo isso. 2. Você não precisatext
eeol=lf
.eol=lf
efetivamente definetext
.* text=auto eol=lf
o primeirotext=auto
é substituído poreol=lf
. Onde você encontrou esse recurso? Aqui está a minha fonte: stackoverflow.com/questions/29435156/...* text=auto eol=lf
do exemplo, pois também foi removido do Drupal. Considere remover os comentários também.