git diff --no-index, mas com vários arquivos

4

Eu realmente gosto do formato de saída do git diff, e eu uso muito como git diff --no-index para comparar arquivos arbitrários não relacionados ao git. Mas, tanto quanto eu posso dizer quando usando --no-index você pode fornecer apenas um único par de arquivos. Eu realmente gostaria de poder passar vários pares, como:

git diff --no-index a.new a.old b.new b.old

E obtenha o tipo de resultado obtido executando git diff em um repositório:

diff --git a/a b/a
index e965047..ce01362 100644
--- a/a
+++ b/a
@@ -1 +1 @@
-Hello
+hello
diff --git a/b b/b
index 2b60207..dd7e1c6 100644
--- a/b
+++ b/b
@@ -1 +1 @@
-Goodbye
+goodbye

Existe alguma maneira de fazer isso com o git diff ou com uma ferramenta semelhante?

    
por Alec 14.12.2015 / 19:10

2 respostas

1

Como git diff --no-index aceita também dois diretórios e os compara, você sempre pode escrever um script wrapper em torno disso, copiando seus arquivos em dois diretórios temporários.

Além disso, não conheço uma ferramenta de comparação que aceite vários pares de arquivos para comparar. Mesmo diff só aceita um único par de arquivos, ou um diretório e uma lista de arquivos.

    
por 23.12.2015 / 16:36
1

Isso é basicamente duas versões dependentes do contexto da resposta de Jaap, , cada uma com um bônus.

Conjuntos completos ou quase completos

Você tem alguns arquivos em um diretório, A, que deseja comparar com alguns outros arquivos. Se o conjunto de arquivos com os quais você deseja compará-los em B for quase idêntico em conteúdo, basta definir git config --global diff.colorMoved true e usar a sugestão do Jaap:

git diff --no-index A/ B/

A "cor movida" usará uma cor de linha diferente quando as linhas removidas de um lugar aparecerem em outro lugar no diff ... se elas foram movidas com o arquivo ou movidas para outro arquivo como em um refatorador.

Arquivos específicos para comparar

Se houver apenas alguns arquivos em B e muitos arquivos em A,

┌ A
| ├ (various folders)
| └ src
|   ├ (various files)
|   ├ foo.c
|   └ bar.c
└ B
  ├ new-foo.c
  └ new-bar.c

... você pode tentar deixar a detecção de renomeação do Git fazer o trabalho. Eu não sei qual versão do Git adiciona o grau de controle de renomeação que é necessário para fazer isso (estou usando v2.18). Além disso, o teste que fiz foi em um conjunto bastante trivial de arquivos.

Você realmente não quer ver que a maioria dos arquivos estão "faltando" em B. Além disso, você não quer se incomodar em dar aos arquivos de B o mesmo nome / caminho que eles aparecem em A, então você deixa -los onde e colocar em um filtro que inclui arquivos renomeados e modificados.

git diff --no-index --diff-filter=RM A/ B/
diff --git a/A/src/foo.c b/B/new-foo.c
similarity index 65%
rename from A/src/foo.c
rename to B/new-foo.c
index dd51990..64445b1 100644
--- a/A/src/foo.c
+++ b/B/new-foo.c
@@ -1,4 +1,4 @@
 octopus
 cow
-dog
 tiger
+flamingo

diff --git a/A/src/bar.c b/B/new-bar.c
similarity index 87%
rename from A/src/bar.c
rename to B/new-bar.c
...
    
por 27.07.2018 / 22:43