Git no Windows: como é que configura um mergetool?
18 answers
Para dar seguimento à resposta de Charles Bailey, aqui está a minha configuração git que está a usar p4merge (ferramenta livre de junção de plataforma 3way); testada no msys Git (Windows) install:
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'
Ou, a partir de um cmd windows.exe shell, a segunda linha passa a ser:
git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
As mudanças (em relação a Charles Bailey):
- adicionado à configuração global do git, ou seja, válido para todos os projectos git e não apenas para o actual
- o valor de configuração personalizado da ferramenta reside em "mergetool.[ferramenta].cmd", não "merge".[ferramenta].cmd " (tolo eu, passou uma hora solucionando por que o git continuava reclamando de ferramenta não existente)
- adicionou aspas duplas para todos os nomes dos ficheiros de modo a que os ficheiros com espaços possam ainda ser encontrados pela ferramenta de junção (eu testei isto no msys Git do Powershell)
- note que, por omissão, o Perforce irá adicionar a sua pasta de instalação à PATH, pelo que não é necessário indicar a localização completa do p4merge no comando
Telecarregamento: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools
EDIT (Fev 2014)
Como apontado por @Gregory Pakosz, mais recente msys git agora "nativamente" suporta p4merge (testado em 1.8.5.2.msysgit.0).
Poderá mostrar uma lista de ferramentas suportadas se executar:
git mergetool --tool-help
Deve ver p4merge na lista disponível ou válida. Se não, por favor, actualize o seu git.
Se o p4merge foi listado como disponível, está no seu locale só tem de definir a junção.ferramenta:
git config --global merge.tool p4merge
Se foi listado como válido, tem de definir mergetool.p4merge.localização para além da junção de .ferramenta:
git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
- o caminho acima é um exemplo quando p4merge foi instalado para o usuário atual, não em todo o sistema (não precisa de direitos de administração ou UAC elevação)
- embora
~
deva expandir-se para o directório do utilizador actual (por isso, em teoria, o caminho deve ser~/AppData/Local/Perforce/p4merge.exe
), isto não funcionou para mim - ainda melhor teria sido tirar partido de uma variável de ambiente (por exemplo
$LOCALAPPDATA/Perforce/p4merge.exe
), o git não parece estar a expandir variáveis de ambiente para caminhos (se souber como pôr isto a funcionar, por favor avise-me ou actualize esta resposta)
A definir o mergetool.p4merge.cmd não funciona mais desde o Git começou a tentar apoiar p4merge, consulte libexec/git-core/git-mergetool--lib.por isso só temos de especificar o mergetool caminho para o git,por exemplo, o p4merge:
git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge
Então vai funcionar.
Mas eu encontrei as instruções que eu precisava para fazê-lo funcionar no Windows em este post, instruções que diferem ligeiramente das outras abordagens listadas aqui. Basicamente, foi adicionado estas linhas ao meu ficheiro .gitconfig
:
[merge]
tool = kdiff3
[mergetool "kdiff3"]
path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
keepBackup = false
trustExitCode = false
A trabalhar bem agora!
Sob Cygwin, a única coisa que funcionou para mim é a seguinte:
git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'
Além disso, gosto de desligar a mensagem imediata para o difftool:
git config --global difftool.prompt false
git mergetool
é totalmente configurável para que você possa escolher a sua ferramenta favorita.
A documentação completa está aqui: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html
Em resumo, poderá definir uma ferramenta de junção por omissão, definindo a variável de configuração do Utilizador merge.tool
.
Se a ferramenta de junção for uma das que é suportada nativamente por ela, só terá de definir mergetool.<tool>.path
a localização completa da ferramenta (substituir <tool>
pelo que configurou merge.tool
para ser.
Caso contrário, poderá definir mergetool.<tool>.cmd
para um pouco de linha de comandos a ser nivelado no tempo de execução com as variáveis de linha de comandos $BASE, $LOCAL, $REMOTE, $MERGED
definidas para os ficheiros apropriados. Tem de ter um pouco de cuidado com a fuga, quer edite directamente um ficheiro de configuração ou defina a variável com o comando git config
.
git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'
Depois de configurar a sua ferramenta de junção favorita, é apenas uma questão de correr. sempre que tiver conflitos para resolver.
A ferramenta p4merge do Perforce é uma boa ferramenta de junção autônoma.
Parece que as versões mais recentes do git suportam o p4merge directamente, por isso
git config --global merge.tool p4merge
Deve ser tudo o que precisa, se p4merge.a exe está no teu caminho. Não é necessário configurar o cmd ou o caminho.
Para além da comparação no Windows 7
git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
Tive de deixar cair a citação extra usando o msysGit no windows 7, não sei porquê.
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
Se está a fazer isto através de cygwin, pode precisar de usar cygpath:
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'
Bah, isto Finalmente funcionou para mim (Windows 7 + Cygwin + TortoiseMerge):
Entra .git/config:cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")
Graças aos cartazes anteriores para a dica usar cygpath!
Uso uma aplicação chamada WinMerge ( http://winmerge.org/ informação do manual deles ( http://manual.winmerge.org/CommandLine.html )
Este é o script bash que eu uso da Directiva mergetool
via .gitconfig
#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file
file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
then
file1="/tmp/gitnull"
`echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
then
file2="/tmp/gitnull"
`echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"
Basicamente a bash contabiliza quando o resultado da diferença num ficheiro vazio e cria um novo ficheiro temporário na localização correcta.
Encontrei duas formas de configurar " SourceGear DiffMerge " como difftool e mergetool nas janelas do github.
Os seguintes comandos numa janela da linha de comandos irão actualizar o seu .gitconfig para configurar git use DiffMerge:
git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"'
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'
[OU]
Adicione as seguintes linhas ao seu .gitconfig. Este ficheiro deverá estar na sua pasta pessoal em C:\Users\UserName:
[diff]
tool = diffmerge
[difftool "diffmerge"]
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
[merge]
tool = diffmerge
[mergetool "diffmerge"]
trustExitCode = true
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
Também pode querer adicionar estas opções:
git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false
Além disso, não sei porquê, mas a citação e o corte da resposta do Milan Gardian estragaram tudo para mim.
Se alguém quiser usar o gvim como sua ferramenta de diferenças no TortoiseGit, então é isto que você precisa para introduzir na entrada de texto para a localização da ferramenta de diferenças externas:
path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
Para o IntelliJ IDEA (edição comunitária) configuração do git em rede 3-way no ambiente Windows(~/.gitconfig
)
Cygwin
[mergetool "ideamerge"]
cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
tool = ideamerge
Msys
[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
tool = ideamerge
O ~/winpath.sh é converter caminhos para janelas no msys e é retirado de questão de conversão de caminhos do msys no stackoverflow
#! /bin/sh
function wpath {
if [ -z "$1" ]; then
echo "$@"
else
if [ -f "$1" ]; then
local dir=$(dirname "$1")
local fn=$(basename "$1")
echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';
else
if [ -d "$1" ]; then
echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';
else
echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';
fi
fi
fi
}
wpath "$@"
Para configurar o p4merge, instalado usando o chocolatey nas janelas, tanto para a junção como para o diff, dê uma vista de olhos aqui: https://gist.github.com/CamW/88e95ea8d9f0786d746a
Se tiver problemas em abrir o p4merge a partir do SourceTree, procure o seu ficheiro de configuração local chamado config sob o MyRepo.git e remove qualquer configuração de junção. No meu caso, estava a tentar abrir a fusão que acabei de desinstalar.