É possível git merge
ignorar as diferenças de final de linha?
Talvez eu esteja fazendo a pergunta errada ... mas:
Eu tentei usar, config.crlf input
mas as coisas ficaram um pouco confusas e fora de controle, especialmente quando eu a apliquei após o fato .
Por um lado, a aplicação dessa configuração após o fato não parece afetar os arquivos que foram confirmados no repositório antes de aplicar esta opção. Outra coisa é que, de repente, todas as confirmações agora resultam em muitas mensagens de aviso irritantes sobre o CRLF sendo convertidas em LF.
Para ser sincero, eu realmente não me importo com o final de linha usado, eu pessoalmente prefiro o estilo Unix \n
, mas tanto faz. Tudo o que me interessa é git merge
ser um pouco mais inteligente e ignorar as diferenças nos finais de linha.
Às vezes, tenho dois arquivos idênticos, mas o git os marca como estando em conflito (e o conflito é o arquivo inteiro ) simplesmente porque eles usam um caractere final de linha diferente.
Atualizar:
Descobri que git diff
aceita uma --ignore-space-at-eol
opção, seria possível deixar de git merge
usar essa opção também?
git config merge.renormalize true
Respostas:
Atualização 2013:
Versões git mais recentes autorizam o uso da mesclagem com a estratégia
recursive
e a opção de estratégia (-X
):Mas usar "
-Xignore-space-change
" também é uma possibilidadeO jakub.g também comenta que as estratégias também funcionam com a colheita de cerejas :
Isso funciona muito melhor que
ignore-all-space
.Resposta original (maio de 2009)
O patch para ignorar o estilo eol foi proposto em junho de 2007 , mas apenas diz respeito
git diff --ignore-space-at-eol
, nãogit merge
.Na época, a pergunta foi feita:
Julio C Hamano não estava exatamente entusiasmado:
A idéia geral, quando se trata
git merge
, é confiar na ferramenta de mesclagem de terceiros.Por exemplo, eu configurei o DiffMerge para ser a ferramenta para mesclagem do Git, definindo um conjunto de regras que permite que a ferramenta de mesclagem ignore o eol em determinados tipos de arquivos.
Instalação no Windows, com o MSysGit1.6.3, para a sessão do DOS ou Git bash, com o DiffMerge ou o KDiff3:
c:\HOMEWARE\cmd
.merge.sh:
Comandos de configuração do Git:
configuração do git no nível do sistema:
Script DOS (nota: o comando dos2unix vem daqui e é usado para simular um estilo Unol eol. Esse comando foi copiado no diretório mencionado no início desta resposta.):
C:\HOMEWARE\git\test>mkdir test_merge C:\HOMEWARE\git\test>cd test_merge C:\HOMEWARE\git\test\test_merge>git init C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout -b windows Switched to a new branch 'windows' C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout master C:\HOMEWARE\git\test\test_merge>git checkout -b unix Switched to a new branch 'unix' C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt C:\HOMEWARE\git\test\test_merge>dos2unix a.txt Dos2Unix: Processing file a.txt ... C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style" [unix c433a63] add 3 lines, all file unix eol style C:\HOMEWARE\git\test\test_merge>git merge windows Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. C:\HOMEWARE\git\test\test_merge>git ls-files -u 100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt 100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt 100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt C:\HOMEWARE\git\test\test_merge>git mergetool Merging the files: a.txt Normal merge conflict for 'a.txt': {local}: modified {remote}: modified Hit return to start merge resolution tool (diffmerge):
Nesse ponto (pressionando "return"), o DiffMerge ou o KDiff3 serão abertos e você verá por si mesmo quais linhas são realmente mescladas e quais são ignoradas.
Aviso : o arquivo de resultado estará sempre no modo Windows eol (CRLF) com o DiffMerge ... O
KDiff3 oferece para salvar de uma maneira ou de outra.
fonte
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
(isso funciona muito melhor do queignore-all-space
)Eu estava procurando a mesma resposta e descobri isso
Portanto, executar este comando em qualquer repositório fará o truque:
fonte
Depois de ler https://stackoverflow.com/a/12194759/1441706 e https://stackoverflow.com/a/14195253/1441706
para mim, esse comando fez o truque perfeitamente:
fonte
Como nesta resposta: https://stackoverflow.com/a/5262473/943928
Você poderia tentar:
git merge -s recursive -Xignore-space-at-eol
fonte
O que fiz foi deixar tudo como padrão (por exemplo, autocrlf = true), tocar em todos os arquivos (encontrar. -Exec touch {} \;), deixar o git vê-los como 'modificados' e enviá-los de volta, e pronto. Caso contrário, você sempre será atormentado por mensagens irritantes ou diferenças surpreendentes, ou terá que desativar todos os recursos de espaço em branco do git.
Você perderá informações de culpa, mas é melhor fazê-lo mais cedo ou mais tarde :)
fonte
"git merge -Xrenormalize" funciona como um encanto.
fonte
Não parece que isso possa ser feito diretamente, mas este post sugere uma solução alternativa.
http://osdir.com/ml/git/2009-02/msg02532.html
fonte
http://stahlforce.com/dev/index.php?tool=remcrlf
Eu tentei, mas se após a última linha do seu código você ainda não tinha o CRLF, ele adiciona por si só um LF e o arquivo parece alterado no git. Fora isso, funciona.
fonte
Parece-me agora que a melhor maneira é normalizar as terminações de linha nos dois ramos (e confirmar) antes de mesclá-los.
Pesquisei "converter crlf em lf" no Google e achei isso como o primeiro resultado:
http://stahlforce.com/dev/index.php?tool=remcrlf
Eu baixei e usei, parece uma boa ferramenta.
Certifique-se de especificar um diretório e um tipo de arquivo (por exemplo, .py), caso contrário, ele poderá tentar mexer com o conteúdo do
.git
diretório!fonte
AFAICT, (ainda não tentei), você pode
git diff
comparar o ramo que deseja mesclar ao ancestral comum e aplicar os resultadosgit apply
. Ambos os comandos têm--ignore-whitespace
opções para ignorar erros de final de linha e espaço em branco.Infelizmente, se o patch não se aplicar corretamente, toda a operação será abortada. Você não pode corrigir conflitos de mesclagem. Há uma
--reject
opção para deixar pedaços incontroláveis nos.rej
arquivos, o que ajuda, mas não é o mesmo que ter os conflitos de mesclagem mostrados em um arquivo.fonte
Depois de ler Resolver conflitos de mesclagem: Forçar a substituição de todos os arquivos
Finalmente resolvi minha versão deste problema. Eu estava tentando obter atualizações do repositório upstream, mas o atual estava tendo problemas relacionados ao CRLF e não foi possível mesclar como resultado. Note-se que eu não tinha mudanças locais que eu precisava me preocupar. Os seguintes passos resolveram o meu problema:
Conforme as instruções do github sobre sincronização de garfos ( https://help.github.com/articles/syncing-a-fork/ ):
git fetch upstream
git reset --hard upstream/master
Meu entendimento limitado do git me diz que isso está fazendo o que eu quero - reformulando meu fork (sem alterações reais não confirmadas) para obter todas as alterações feitas na fonte upstream. De acordo com a página de origem, essa etapa normalmente não deve ser necessária, mas o problema da CRLF exigiu.
git merge upstream/master
git push
fonte
git reset --hard upstream/master
joga fora sua filial local e aponta para elaupstream/master
, fazendogit merge upstream/master
um não-op?no entanto, sugiro usar ferramentas como sed para obter finais de linha corretos e, em seguida, arquivos diff. Passei algumas horas no diffing projetos com vários finais de linha.
A melhor maneira era:
.git
diretório) para outro diretório, crie um repositório nele e adicione-os e confirme-os (deve estar na ramificação principal do novo repositório).dev
(git checkout -b dev
), confirme arquivos nesse ramo e execute (se o primeiro projeto estiver no mestre):git diff master..dev --names-only
para ver apenas os nomes dos arquivos alteradosfonte