git difftool, abra todos os arquivos diff imediatamente, não em série

240

O comportamento padrão do git diff é abrir cada arquivo diff em série (aguarde o fechamento do arquivo anterior antes de abrir o próximo arquivo).

Estou procurando uma maneira de abrir todos os arquivos de uma só vez - no BeyondCompare, por exemplo, isso abriria todos os arquivos em guias na mesma janela do BC.

Isso facilitaria a revisão de um conjunto complexo de alterações; deslize para frente e para trás entre os arquivos diff e ignore os arquivos sem importância.

Seba Illingworth
fonte
"git diff" ou "git difftool"? Você pode querer postar solicitação em (aberto para todos, e com interface web varous) lista de discussão git: [email protected]
Jakub Narębski
Estou usando o "git difftool" para acionar o aplicativo diff externo. Obrigado pela ideia da lista de discussão.
Seba Illingworth
Seria útil conhecer a plataforma. Em uma plataforma baseada em Unix, eu escrevia um script para executar o diff e instruía o git a usar esse script. No script, eu simplesmente executava o diff em segundo plano e deixava o script morrer.
Chris Cleeland
Plataforma Windows, mas obrigado pelas idéias, Chris.
Seba Illingworth
1
Para mergetool: stackoverflow.com/questions/39259116/…
Ciro Santilli escreveu:

Respostas:

214

A partir da gitv1.7.11, você pode usar git difftool --dir-diffpara executar uma comparação de diretório.

Esse recurso funciona bem com o Meld 3.14.2, por exemplo, e permite navegar em todos os arquivos modificados:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Esta é uma função útil do Bash:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

A resposta a seguir se aplica a gitinstalações anteriores à v1.7.11.


Essa mesma pergunta foi feita na lista de e-mails do git .

Eu montei um script de shell com base nesse segmento de email que executa uma diferença de diretório entre confirmações arbitrárias.

A partir do git v1.7.10, o git-diffallscript é incluído na contribinstalação padrão do git.

Para versões anteriores à v1.7.10, você pode instalar a partir do git-diffallprojeto no GitHub .

Aqui está a descrição do projeto:

O script git-diffall fornece um mecanismo diff baseado em diretório para o git. O script conta com a opção de configuração diff.tool para determinar qual visualizador diff é usado.

Este script é compatível com todos os formulários usados ​​para especificar um intervalo de revisões a serem diferidas:

1) git diffall: mostra diff entre a árvore de trabalho e as alterações faseadas
2) git diffall --cached [<commit>]: mostra o diff entre as mudanças faseadas e HEAD (ou outro commit nomeado)
3) git diffall <commit>: mostra o diff entre a árvore de trabalho e o commit nomeado
4) git diffall <commit> <commit>: mostra o diff entre os dois commits nomeados
5) git diffall <commit>..<commit>: mesmo como acima
6) git diffall <commit>...<commit>: mostra as alterações no ramo que contém e até o segundo, iniciando em um ancestral comum de ambos<commit>

Nota: todos os formulários usam um limitador de caminho opcional [--] [<path>]

Este script é baseado em um exemplo fornecido por Thomas Rast na lista do Git .

Tim Henigan
fonte
Qual é a diferença entre git-diffall e github.com/wmanley/git-meld ? Eu tentei os dois e eles parecem fornecer funcionalidade idêntica à primeira vista.
Kynan
5
Aprecio muito o seu script. Francamente, não consigo entender por que o Git não se comporta da maneira certa a esse respeito (a Mercurial faz isso há anos), nem consigo entender a falta de interesse da comunidade Git.
Douglas
6
Atualização (referente git difftool --dir-diffe além do Compare): Entrei em contato com o Scooter Software (autores do Beyond Compare) e eles dizem que bcompare.exenão é uma solução suportada e podem causar problemas se houver mais de um diff aberto por vez. Eles planejam adicionar suporte a diferenças de pasta bcomp.exeem uma versão futura (enquanto isso, continuarei usando bcompare.execomo solução alternativa não suportada).
Peter Rust
4
@coin Acabei de testar com o Beyond Compare 4 e --dir-diff parece funcionar com o bcomp.exe suportado.
Peter Rust
5
Apenas comentando para dizer que --dir-difffunciona perfeitamente com Meld. A partir daí, permitirá que você selecione e visualize as diferenças para arquivos individuais.
Mkasberg
61

Aqui está o que eu decidi ...

Copie o seguinte código em um arquivo chamado git-diffall(sem extensão):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Coloque o arquivo na cmdpasta do seu diretório de instalação do git (por exemplo C:\Program Files (x86)\Git\cmd)

E use como você faria git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Notas: A chave para isso é o & param, que informa ao comando diff externo para executar em uma tarefa em segundo plano, para que os arquivos sejam processados ​​imediatamente. No caso do BeyondCompare, isso abre uma tela com cada arquivo em sua própria guia.

Seba Illingworth
fonte
Obrigado por publicar. Infelizmente, ele não funciona com a opção -s do WinMerge. Todos os arquivos temporários, exceto o primeiro, são excluídos antes que o WinMerge os veja.
Carlos Rendon
Carlos: Eu uso o WinMerge com o Git. Minha abordagem foi adicionar um 'sleep 1' após o lançamento do WinMerge (que, no meu caso, parece já iniciar "em segundo plano" - não é necessário &). Dessa forma, o arquivo temporário dura apenas o tempo suficiente para o WinMerge buscá-lo uma vez (exceto em casos estranhos). Isso também significa que são necessários 1 segundo por arquivo para abri-los todos. É um truque desagradável (eu nunca o apresentaria como uma "resposta"!), Mas fácil e bastante eficaz.
Woody Zenfell III
2
Para uso no Linux, com o Git 2.x, tive que fazer uma pequena modificação: mude "$filename"para "../$filename". Em seguida, funcionou perfeitamente com o Beyond Compare #
Dave C
1
@DaveC no thread original que diz para "armazenar o arquivo na pasta cmd da sua instalação do git" e prossegue com um exemplo no windows. Onde você armazenou o arquivo "git-diffall" no Linux?
M4l490n
2
Precisamos reiniciar o Windows depois de adicionar o git-diffallarquivo à C:\Program Files\Git\cmdpasta? Eu fiz exatamente como instruído, mas ao fazê $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
NESDIS
19

meld possui um recurso interessante: se você fornecer um diretório sob controle de origem (Git, Mercurial, Subversion, Bazaar e provavelmente outros), ele listará automaticamente todos os arquivos alterados e você poderá clicar duas vezes para visualizar as diferenças individuais.

Na IMO, é muito mais fácil digitar meld .e descobrir o VCS do que configurar o VCS para iniciar meld. Além disso, você pode usar o mesmo comando, independentemente do VCS que seu projeto estiver usando, o que é ótimo se você alternar muito entre eles.

A única desvantagem é que é mais lento para o meld procurar alterações do que as alterações do git / hg / svn, embora seja lento o suficiente para ser um problema dependerá de como você o está usando, tenho certeza.

Tom
fonte
4
Para mim, a principal desvantagem é que o meld (por qualquer motivo) abre o diff em uma nova janela em vez de uma nova guia e depois de fechar o diff, o arquivo no diretório de trabalho é aberto em uma nova guia com uma mensagem pop-up irritante antes.
22911 kynan
ferramenta agradável, mas instalação horrível do Windows (no início de 2012).
Wernight
@ kynan Esta parece ser a solução perfeita para uma maneira agnóstica de diferenciar o VCS, se não para aquela coisa irritante de pop-up de janela dupla. É uma vergonha. :(
PKKid
Uma grande característica do meld são seus filtros diff: ignore as alterações, por exemplo, nos comentários ou adicione / remova linhas em branco, o que git diffnão oferece.
Kynan #
1
Eu uso essa abordagem há mais ou menos um ano; ele funciona bem para projetos menores, mas uma vez que você tem um projeto grande (ou seja, muitos arquivos), é proibitivamente lento, pois "verifica" manualmente as diferenças do git (não sabe por que adota essa abordagem quando o git claramente pode fornecer uma lista de arquivos diretamente ...)
namuol
3

Eu encontrei esse método (GitDiff.bat e GitDiff.rb) que copia os arquivos para diretórios temporários antigos / novos e, em seguida, compara uma pasta com eles.

Mas eu prefiro ver os arquivos de trabalho diretamente (a partir do diretório de trabalho), pois o BeyondCompare possui o recurso útil de poder editar o arquivo de dentro da janela do diff, o que é ótimo para limpezas rápidas.

Editar: um método semelhante aqui em resposta à minha pergunta na lista de discussão do git.

Seba Illingworth
fonte
3

git meld=> https://github.com/wmanley/git-meld é um script incrível que abrirá um diff limpo de todos os arquivos em uma única janela.

Khaja Minhajuddin
fonte
Funciona bem! Como um bônus adicional, funciona exatamente como hg meld. Obrigado!
PKKid
2

Observe aqui que o Araxis Merge tem uma opção de comando '-nowait':

-nowait Impede que a comparação espere pelo fechamento de uma comparação

Talvez isso retorne um código de saída imediato e funcionaria, alguém experimentou isso? Não foi possível encontrar opção semelhante para o BeyondCompare ...

Seba Illingworth
fonte
2

Difusa também possui integração VCS. Ele interopera com uma infinidade de outros VCS, incluindo SVN, Mercurial, Bazaar, ... Para o Git, ele até mostra três painéis se algumas, mas nem todas, mudanças forem realizadas. No caso de conflitos, haverá até quatro painéis.

Captura de tela de difusa com edições em etapas e em etapas

Invoque-o com

diffuse -m

na sua cópia de trabalho do Git.

Se você me perguntar, o melhor visual diferenciado que eu já vi há uma década. (E eu tentei misturar também.)

krlmlr
fonte
Você pode dizer qual parte do difuso você gostou, especialmente sobre o meld?
Musiphil
@musiphil: Gosto da sua simplicidade - parece ter o conjunto exato de recursos necessários para resolver a tarefa, não mais, mas também não menos. (Como o realinhamento das diferenças e a largura do tamanho da guia.) Não me lembro por que mudei do meld e não o usei desde então, então não posso compará-los agora.
krlmlr
1
Diffuse trabalhou com o git sem nenhuma configuração. Diffuse -m abre uma única janela com diferenças de git em diferentes abas; enquanto outras ferramentas precisam de muita configuração para começar.
Mosh
1

Se tudo o que você deseja fazer é abrir todos os arquivos modificados no momento, tente algo como:

vi $ (status do git | sed -n '/.* modificado: * / s /// p')

Se você está fazendo confirmações de "conjuntos complexos de alterações", convém reconsiderar seu fluxo de trabalho. Um dos recursos realmente bons do git é que facilita ao desenvolvedor reduzir conjuntos de alterações complexos a uma série de patches simples. Em vez de tentar editar todos os arquivos que estão atualmente modificados, convém procurar

git add --patch
o que permitirá que você selecione seletivamente pedaços.

William Pursell
fonte
1

Eu escrevi um script do PowerShell que duplicará duas árvores de trabalho e será comparado com o DiffMerge. Então você pode fazer:

GitNdiff master~3 .

Para comparar o ramo principal, três checkins atrás, com a árvore de trabalho atual, por exemplo.

É brilhante e novo e provavelmente cheio de insetos. Uma desvantagem é que os arquivos da sua árvore de trabalho que ainda não foram adicionados ainda são copiados para as duas árvores de trabalho. Também pode ser lento.

http://github.com/fschwiet/GitNdiff

Frank Schwieterman
fonte
1

Para aqueles interessados ​​em usar o git-diffall no Mac OS X com Araxis, bifurquei o projeto git-diffall no github e adicionei um AppleScript que envolve o comando Araxis Merge. Nota: este é um clone ligeiramente modificado do araxisgitdiffarquivo que acompanha o Araxis Merge for Mac OS X.

https://github.com/sorens/git-diffall

sorens
fonte
1

O seguinte funciona com meld e kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

Abre todos os arquivos em uma janela que você pode navegar com facilidade. Pode ser usado com conjuntos de alterações no lugar de origem / nome da filial

por exemplo: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1

feltspar
fonte
-2

Você pode usar o gitk e ver todas as diferenças ao mesmo tempo

Aragorn
fonte
3
Sim eu acho gitk útil, mas quando se trata de-ing diff BC é o que eu quero ver :)
Seba Illingworth