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
):
git merge -s recursive -Xignore-space-at-eol
Mas usar " -Xignore-space-change
" também é uma possibilidade
O jakub.g também comenta que as estratégias também funcionam com a colheita de cerejas :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
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ão git merge
.
Na época, a pergunta foi feita:
Deve --ignore-space-at-eol
ser uma opção para git-merge
?
Mesclagens são onde essa funcionalidade é importante.
Quais são as semânticas de uma mesclagem auto-resolvida com essas opções em vigor - elas são usadas apenas para a detecção de renomeação ou, por exemplo, não sinalizamos conflitos apenas com alterações de espaço em branco? E se não, qual versão aceitamos automaticamente?
Julio C Hamano não estava exatamente entusiasmado:
Isso certamente é tentador, mas suspeito que isso deva ser deixado para as rodadas posteriores.
Suspeito que ele introduzisse um conceito de dois tipos diferentes de diferenças, uma a ser processada mecanicamente (ou seja, uso em mesclagem com "git-merge-recursive" e se aplica a "git-am") e outra a ser inspecionada por humanos para entender.
Muitas vezes, pode ser útil mover a entrada para o último caso, mesmo que a saída da comparação de arquivos de entrada intermediários possa não ser facilmente utilizável para aplicação mecânica.
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:
- defina um diretório em seu PATH (aqui:)
c:\HOMEWARE\cmd
.
- adicione nesse diretório o script merge.sh (wrapper para sua ferramenta de mesclagem favorita)
merge.sh:
#!/bin/sh
# Passing the following parameters to mergetool:
# local base remote merge_result
alocal=$1
base=$2
remote=$3
result=$4
if [ -f $base ]
then
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$base" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# for merge respecting eol, KDiff3 is better than DiffMerge (which will always convert LF into CRLF)
# KDiff3 will display eol choices (if Windows: CRLF, if Unix LF)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$alocal" "$remote" -o "$result"
else
#there is not always a common ancestor: DiffMerge needing 3 files, BASE will be the result
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$result" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# KDiff3 however does know how to merge based on 2 files (not just 3)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$remote" -o "$result"
fi
- Declarar seu wrapper de mesclagem para Git
Comandos de configuração do Git:
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd "merge.sh \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"$PWD/$MERGED\"
git config --global mergetool.diffmerge.trustExitCode false
git config --global mergetool.diffmerge.keepBackup false
- Verifique se autoCRLF é falso
configuração do git no nível do sistema:
git config ---system core.autoCRLF=false
- Teste se, quando duas linhas são idênticas (mas seus caracteres EOL), o DiffMerge ou o KDiff3 ignoram essas linhas durante uma mesclagem.
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.