Fazendo git diff --stat mostrar o caminho completo do arquivo

104

Ao fazer, git diff --statalguns arquivos são listados com o caminho completo da base do repositório, mas alguns arquivos são listados como:

.../short/path/to/filename.  

Esse é o caminho com o qual começa ...e apenas o caminho curto é mostrado.

Eu gostaria git diffde listar o caminho completo de todos os arquivos para que sejam facilmente processados ​​por um script. Existe alguma maneira git diffde sempre mostrar o caminho completo

Badri
fonte

Respostas:

108

O git diffcomando assume valores opcionais para --stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(Para scripts, você pode querer usar git diff-treediretamente, pois é mais um comando "encanamento", embora eu suspeite que você ficará bem de qualquer maneira. Observe que você precisa do mesmo texto extra --statao usar git diff-tree. A diferença essencial entre usar a git diff"porcelana "front end, e o git diff-treecomando de encanamento, é que git diffprocura suas configurações definidas para opções como diff.renamesdecidir se deve fazer a detecção de renomeação. Bem, isso, mais o front end git difffará o equivalente a git diff-indexse você estiver comparando um commit com o índice , por exemplo. Em outras palavras, git diff lê sua configuração e invoca o encanamento correto automaticamente .)

Torek
fonte
6
git diff --numstat é o mesmo que diff-tree
cmcginty
1
Observe que, para limitar a largura da última parte (+++ / ---), você pode usar uma --stat-graph-width=...chave separada . Observe também que definir alto --stat-graph-width=e --stat-name-width=não é suficiente, você também deve definir --stat-width=grande o suficiente para cobrir os dois.
jakub.g
@ jakub.g: bom ponto. Baseado em um pouco de escavação no código-fonte do git, isso foi feito com o git 1.7.10.
Torek em
4
Existe alguma maneira de globalizar isso? Digitar sempre é uma loucura.
Rudie
@Rudie: infelizmente, não: há uma variável de configuração que diff.statGraphWidthvocê pode usar para definir o --stat-graph-widthvalor, mas as outras são padronizadas para a largura do seu terminal. (Portanto, resposta alternativa: "sim, basta deixar sua janela de terminal com 1000 colunas de largura" :-))
torek
22

Para processamento de script, pode ser melhor usar um dos seguintes:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

Cada um deles se torna mais prático para um processamento robusto de script quando combinado com a -zopção, que usa NULcomo terminadores de campo.

cmbuckley
fonte
De acordo com meus testes, você não recebe o caminho completo do recurso usando esses comandos. Por enquanto, vejo apenas caminhos relativos para arquivos excluídos. Não sei se esse é o caso apenas para esses arquivos.
GCallie de
1
Todos os outpu retornarão caminhos relativos a git rev-parse --show-toplevel. O problema original referia-se a caminhos truncados, o que é um problema em diffstats, especialmente para nomes de arquivo longos ou um valor baixo para --stat-name-width. Os comandos acima não truncarão os caminhos, mas mostrarão o caminho "completo" conforme solicitado, embora ainda relativo à raiz do repositório.
cmbuckley de
18

Para usuários do Bash, você pode usar a $COLUMNSvariável para preencher automaticamente a largura do terminal disponível:

git diff --stat=$COLUMNS

Nomes de caminhos muito longos ainda podem estar truncados; neste caso, você pode reduzir a largura da peça +++ / --- usando --stat-graph-width, por exemplo, isso limita a 1/5 da largura do terminal:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

Para uma solução mais genérica, você poderia usar a saída de tput colspara determinar a largura do terminal.

John Mellor
fonte
2
Existe alguma maneira de globalizar --stat=$COLUMNS,$COLUMNS? Digitar sempre é uma loucura.
Rudie
@Rudie adicione export COLUMNSao seu ~/.bashrce em seu ~/.gitconfigabaixo [alias], adicionesmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841
@ user151841 Isso muda apenas diff. Eu quero que ele funcione para mesclagens e puxões, etc. também. (Não é possível fazer isso manualmente lá.) Não acho que o GIT suporte isso.
Rudie
@Rudie Bem, após a conclusão do pull ou merge, você pode diferenciar entre o hashes anterior e o novo.
user151841
2
@ user151841 Claro, mas a mesclagem já fornece um resumo estatístico. Sem parâmetros / configuração. Seria ótimo se todos os 'resumos de estatísticas' usassem a mesma configuração.
Rudie
4

Há uma opção --name-only: git diff --name-only. A opção também é suportada por outros comandos git como showe stash.

Os caminhos não são encurtados com a opção.

Yevhen Pavliuk
fonte
0

Eu criei o seguinte alias git:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Ele lê a contagem de colunas do tput colscomando. O padrão é diffing contra master, mas você pode opcionalmente especificar outro branch.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
user151841
fonte
0

Uma solução simples que encontrei foi fazer isso: (só funciona em * nix, desculpe, não osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Esta versão funciona para ambos, mas não fica bem no osx.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"
Javier Buzzi
fonte
-1

Descobri que o comportamento de diff --stat mudou em algum lugar em torno do git 1.7.10, onde anteriormente ele encurtava os caminhos de arquivo para uma largura fixa por padrão - agora ele exibe tanto quanto sua janela de terminal permitir. Se você estiver enfrentando esse problema, certifique-se de atualizar para 1.8.0 ou mais recente.

Alex Spurling
fonte