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.


"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: git@vger.kernel.org
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

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 .


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.


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.


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.



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 ...


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.)


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.


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


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


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


-2

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


3
Sim eu acho gitk útil, mas quando se trata de-ing diff BC é o que eu quero ver :)
Seba Illingworth
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.