Fui mordido pelo problema de final de linha do Windows / Linux com o git. Parece, via GitHub, MSysGit e outras fontes, que a melhor solução é ter seus repositórios locais definidos para usar finais de linhas no estilo linux, mas definidos core.autocrlf
como true
. Infelizmente, eu não fiz isso cedo o suficiente, então agora toda vez que faço alterações, as terminações da linha são acionadas.
Eu pensei que tinha encontrado uma resposta aqui, mas não consigo fazer isso funcionar para mim. Meu conhecimento de linha de comando do Linux é limitado, na melhor das hipóteses, então nem tenho certeza do que a linha "xargs fromdos" faz em seu script. Continuo recebendo mensagens sobre esse arquivo ou diretório e, quando consigo apontá-lo para um diretório existente, ele diz que não tenho permissões.
Eu tentei isso com o MSysGit no Windows e através do terminal Mac OS X.
fonte
Respostas:
A documentação do git para gitattributes agora documenta outra abordagem para "corrigir" ou normalizar todas as terminações de linha no seu projeto. Aqui está a essência:
Isso aproveita um novo
--renormalize
sinalizador adicionado no git v2.16.0, lançado em janeiro de 2018. Para versões mais antigas do git, existem mais algumas etapas:fonte
git reset
, por favor?git status
é executargit diff --ignore-space-at-eol
apenas para garantir que as únicas alterações que você está enviando sejam as terminações da linha.git reset
não detectará modificações e, portanto, é inútil.--renormalize
bandeira adicionado v2.16.0 git que foi lançado em janeiro de 2018. A--renormalize
bandeira consolida o processo de finais de linha processamento de re-para cada arquivo monitorado em um único comando:git add --renormalize .
.A maneira mais fácil de corrigir isso é fazer um commit que corrija todas as terminações de linha. Supondo que você não tenha nenhum arquivo modificado, faça o seguinte.
fonte
Meu procedimento para lidar com os finais de linha é o seguinte (batalha testada em vários repositórios):
Ao criar um novo repositório:
.gitattributes
o primeiro commit junto com outros arquivos típicos como.gitignore
eREADME.md
Ao lidar com um repo existente:
.gitattributes
acordogit commit -a -m "Modified gitattributes"
git rm --cached -r . && git reset --hard && git commit -a -m 'Normalize CRLF' -n"
-n
(--no-verify
é para pular ganchos de pré-confirmação)alias fixCRLF="..."
Em
.gitattributes
Eu declaro todos os arquivos de texto explicitamente como tendo LF EOL, pois geralmente as ferramentas do Windows são compatíveis com o LF, enquanto as ferramentas que não são do Windows não são compatíveis com o CRLF (mesmo muitas ferramentas de linha de comando nodejs assumem o LF e, portanto, podem alterar o EOL em seus arquivos).Conteúdo de
.gitattributes
Meu
.gitattributes
geralmente se parece com:Para descobrir quais extensões distintas são rastreadas pelo git no repo atual, veja aqui
Problemas após normalização
Feito isso, há mais uma ressalva comum.
Diga que você
master
já está atualizado e normalizado e faça o checkoutoutdated-branch
. Muitas vezes, logo após verificar essa ramificação, o git marca muitos arquivos como modificados.A solução é fazer um commit falso (
git add -A . && git commit -m 'fake commit'
) e depoisgit rebase master
. Após o rebase, o commit falso deve desaparecer.fonte
2.7.0.windows.1
, usei o seguinte: #git rm --cached -r . && git reset --hard && git add . && git commit -m "Normalize EOL" -n
Explicação:
git status --short
Isso exibe cada linha que o git é e não tem conhecimento. Arquivos que não estão sob controle git são marcados no início da linha com um '?'. Os arquivos modificados são marcados com um M.
grep "^ *M"
Isso filtra apenas os arquivos que foram modificados.
awk '{print $2}'
Isso mostra apenas o nome do arquivo sem marcadores.
xargs fromdos
Isso pega os nomes dos arquivos do comando anterior e os executa pelo utilitário 'fromdos' para converter as terminações de linha.
fonte
dos2unix
vez defromdos
.Veja como eu corrigi todas as terminações de linha em todo o histórico usando
git filter-branch
. O^M
caractere precisa ser inserido usandoCTRL-V
+CTRL-M
. Eu costumavados2unix
converter os arquivos, pois isso pula automaticamente os arquivos binários.fonte
O "| xargs fromdos" lê da entrada padrão (os arquivos
find
localizam) e a utiliza como argumentos para o comandofromdos
, que converte as terminações de linha. (Fromdos é padrão nesses ambientes? Estou acostumado a dos2unix). Observe que você pode evitar o uso de xargs (especialmente útil se você tiver arquivos suficientes para que a lista de argumentos seja muito longa para xargs):ou
Não tenho muita certeza das suas mensagens de erro. Eu testei com sucesso esse método. Qual programa está produzindo cada um? Para quais arquivos / diretórios você não tem permissão? No entanto, aqui está uma tentativa de adivinhar qual pode ser:
Uma maneira fácil de obter um erro 'arquivo não encontrado' para o script é usar um caminho relativo - use um caminho absoluto. Da mesma forma, você pode obter um erro de permissão se não tiver executado seu script executável (chmod + x).
Adicione comentários e tentarei ajudá-lo a resolver isso!
fonte
ok ... no cygwin não temos fromdos facilmente disponíveis, e esse subconjunto awk aparece na sua cara se você tiver algum espaço no caminho para arquivos modificados (o que tínhamos), então tive que fazer isso de maneira um pouco diferente:
parabéns a @lloyd pela maior parte desta solução
fonte
Siga estas etapas se nenhuma outra resposta funcionar para você:
git config --global core.autocrlf true
; se você estiver no Unix, façagit config core.autocrlf input
git rm --cached -r .
.gitattributes
git add -A
git reset --hard
Então seu local deve estar limpo agora.
fonte
.gitattributes
arquivo é a solução para o problema de terminações de linha?