Dokonywanie git diff --stat pokazuje pełną ścieżkę do pliku

104

Podczas wykonywania git diff --statniektórych plików wyświetlana jest pełna ścieżka z bazy repozytorium, ale niektóre pliki są wymienione jako:

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

Oznacza to, że ścieżka zaczyna się od ...i jest wyświetlana tylko krótka ścieżka.

Chciałbym git diffpodać pełną ścieżkę do wszystkich plików, aby można je było łatwo przetworzyć przez skrypt. Czy jest jakiś sposób, git diffaby zawsze pokazać pełną ścieżkę

Badri
źródło

Odpowiedzi:

109

git diffPolecenia przyjmuje wartości opcjonalnych dla --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>.

(W przypadku skryptów możesz zechcieć użyć git diff-treebezpośrednio, ponieważ jest to bardziej polecenie „hydrauliczne”, chociaż podejrzewam, że i tak będzie dobrze. Zauważ, że potrzebujesz tego samego dodatkowego tekstu, co --statpodczas używania git diff-tree. Podstawowa różnica między użyciem git diff„porcelany „front end i git diff-treepolecenie hydrauliczne polega na tym, że git diffwyszukuje skonfigurowane ustawienia pod kątem opcji, takich jak diff.renamespodjęcie decyzji o wykrywaniu zmiany nazwy. Cóż, plus interfejs użytkownika git diffzrobi to samo, git diff-indexjeśli porównujesz zatwierdzenie z indeksem na przykład. Innymi słowy, git diff odczytuje konfigurację i automatycznie wywołuje odpowiednią instalację ).

torek
źródło
6
git diff --numstat jest tym samym, co diff-tree
cmcginty
1
Zauważ, że aby ograniczyć szerokość ostatniej części (+++ / ---), możesz użyć osobnego --stat-graph-width=...przełącznika. Zauważ również, że ustawienie wysokie --stat-graph-width=i --stat-name-width=nie wystarczające, musisz również ustawić --stat-width=wystarczająco duże, aby pokryć oba.
jakub.g
@ jakub.g: dobra uwaga. Opierając się na odrobinie przekopywania się w źródle git, udało się to z git 1.7.10.
torek
4
Czy istnieje sposób, aby to zglobalizować? Wpisywanie go za każdym razem jest szalone.
Rudie
@Rudie: niestety, nie: istnieje zmienna konfiguracyjna, diff.statGraphWidthktórej możesz użyć do ustawienia --stat-graph-widthwartości, ale inne domyślnie odpowiadają szerokości twojego terminala. (A więc alternatywna odpowiedź: „tak, po prostu zrób okno terminala o szerokości 1000 kolumn” :-))
torek
22

Do przetwarzania skryptów może być lepiej użyć jednego z następujących:

# 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

Każdy z nich staje się bardziej przydatny do niezawodnego przetwarzania skryptów w połączeniu z -zopcją, która używa NULjako terminatorów pól.

cmbuckley
źródło
Według moich testów nie otrzymujesz pełnej ścieżki zasobu za pomocą tych poleceń. Na razie widzę tylko ścieżki względne dla usuniętych plików. Nie wiem, czy dotyczy to tylko tych plików.
GCallie
1
Wszystkie outpu zwróci ścieżki względem git rev-parse --show-toplevel. Pierwotny problem dotyczył obciętych ścieżek, co jest problemem w różnicach, szczególnie w przypadku długich nazw plików lub niskiej wartości parametru --stat-name-width. Powyższe polecenia nie spowodują obcięcia ścieżek, ale pokażą „pełną” ścieżkę zgodnie z żądaniem, aczkolwiek nadal w odniesieniu do katalogu głównego repozytorium.
cmbuckley
18

W przypadku użytkowników Bash możesz użyć $COLUMNSzmiennej, aby automatycznie wypełnić dostępną szerokość terminala:

git diff --stat=$COLUMNS

Bardzo długie nazwy ścieżek mogą nadal zostać obcięte; w tym przypadku można zmniejszyć szerokość części +++ / --- używając --stat-graph-width, na przykład ogranicza to do 1/5 szerokości terminala:

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

Aby uzyskać bardziej ogólne rozwiązanie, możesz użyć danych wyjściowych programu tput colsdo określenia szerokości terminala.

John Mellor
źródło
2
Czy jest sposób na globalizację --stat=$COLUMNS,$COLUMNS? Wpisywanie go za każdym razem jest szalone.
Rudie
@Rudie dodaj export COLUMNSdo swojego ~/.bashrc, aw swoim ~/.gitconfigpod [alias], dodajsmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841
@ user151841 To tylko się zmienia diff. Chcę, żeby to działało również dla połączeń, ściągnięć itp. (Nie można tego zrobić nawet ręcznie). Nie sądzę, aby GIT to obsługiwał.
Rudie
@Rudie Cóż, po zakończeniu ściągania lub scalania możesz rozróżnić poprzednie i nowe skróty.
user151841
2
@ user151841 Jasne, ale scalanie już daje podsumowanie statystyk. Bez parametrów / config. Byłoby wspaniale, gdyby wszystkie „podsumowania statystyk” używały tej samej konfiguracji.
Rudie
4

Jest to opcja --name-only: git diff --name-only. Ta opcja jest również obsługiwana przez inne polecenia git, takie jak showistash .

Ta opcja nie skraca ścieżek.

Yevhen Pavliuk
źródło
0

Utworzyłem następujący alias git:

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

Odczytuje liczbę kolumn z tput colspolecenia. Domyślnie różni się od master, ale możesz opcjonalnie określić inną gałąź.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
user151841
źródło
0

Prostym rozwiązaniem, które znalazłem, było zrobienie tego: (działa tylko na * nix, przepraszam, brak osx)

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

Ta wersja działa w obu przypadkach, ale nie wygląda świetnie na OSX.

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

Zauważyłem, że zachowanie diff --stat zmieniło się gdzieś w okolicach git 1.7.10, gdzie wcześniej domyślnie skracało ścieżki plików do stałej szerokości - teraz wyświetla tyle, na ile pozwala okno terminala. Jeśli napotykasz ten problem, upewnij się, że dokonałeś aktualizacji do wersji 1.8.0 lub nowszej.

Alex Spurling
źródło