2012-05-25 15 views
17

Chciałbym otrzymać listę wszystkich plików, które zmieniły się między dwoma zatwierdzeniami, w tym tymi w submodułach.git: lista wszystkich zmienionych plików, łącznie z tymi w submodułach

wiem, że mogę to zrobić:

git diff --name-only --diff-filter=ACMR ${revision} HEAD 

Zwraca listę plików, w tym submodule ścieżce, ale nie zwraca plików wewnątrz.

Przykład: Zaktualizowałem moduł. Popełniłem super-projekt. Teraz chcę uzyskać listę wszystkich plików, które zostały zmodyfikowane.

Czy znasz sposób, aby to zrobić?

Odpowiedz

3

Więc bardzo prosty skrypt, który zawiera wszystkie zmiany w stosunku do rewizji

#!/bin/sh 
echo "Listing changes for super module" 
git diff $1 --name-only 
subs=(`git submodule | awk '{print $2}'`) 
for sub in ${subs[*]}; do 
    lastrevision=`git diff $1 $sub | fgrep "Subproject" | head -n1 | awk '{print $3}'` 
    cd $sub 
    echo "Listing changes for $sub" 
    git diff $lastrevision --name-only 
    cd .. 
done 

trwa jeden argument - rewizja chcesz porównać. Upewnij się, że istnieje fgrep "Subproject", a nie fgrep "Submodule".

+0

Dziękuję. To pokaże mi pliki, które zmieniły się od ostatniego zatwierdzenia podmodułów. Ale jak mogę zmienić wszystkie pliki, które uległy zmianie (w tym podmoduły) między wersjami super-projektu? – 4eyes

+0

Więc ty też popełniłeś submoduły? Domyślam się, że będziesz potrzebował jakiegoś skryptu ... – BlacKow

+0

ProTip ™: zapisz to jako "submoduły git-diff" i uruchom je za pomocą 'git diff-submoduł' – Zaz

13

Aktualizacja 2017: jak już wspomniano w "see diff of commit on submodule in gitlab"


Original 2012 odpowiedź (sprzed 2017 Git 2.14)

Może to prosta linia wystarczyłoby:

git submodule foreach --recursive git diff --name-status 

To faktycznie wyświetli listę plików w submodułach withi Poddulki n.
(Opcja --recursive pochodzi z git1.7.3 +)

+0

' aktualizacja modułu git - remote --recursive' przez twoje polecenie 'foreach'' diff' nic nie pokazuje (ponieważ po prostu uruchamia 'git diff' w każdym module podległym). Jak możemy zobaczyć różnice w aktualizacji, którą właśnie uruchomiliśmy? – Zaz

+0

@Zaz '' update --remote' zmieniłoby połączenie gitlink (SHA1 reprezentujące zatwierdzone submodule). Jeśli możesz uzyskać poprzednie gitlink sha1 i bieżące (z prostym 'git diff' w repozytorium macierzystym), możesz wejść do modułu częściowego i zrobić' git diff' między tymi dwoma SHA1. – VonC

+0

Myślałem, że pytający szuka sposobu, aby zrobić to automatycznie. – Zaz

3

można dowiedzieć się, jaka wersja to moduł podrzędny był na, jak danego modułu nadrzędnego popełnienia, używając git ls-tree:

subcommit=$(git ls-tree $parentcommit $submodulepath | awk '{print $3}') 

Tak oto skrypt które powinny dać Ci dużo drogi tam, aż do formatowania wyjścia i takie:

#!/bin/sh 

function compare { 
    if [[ -z "$3" ]]; 
     then git diff --name-only --ignore-submodules=all --diff-filter=ACMR "$1" "$2" 
     else git diff --name-only --ignore-submodules=all --diff-filter=ACMR "$1" "$2" | awk -v r=$3 '{ print "" r "/" $0}' 
    fi 

    for submodule in `git submodule | awk '{print $2}'` 
    do 
     old=$(git ls-tree $1 $submodule | awk '{print $3}') 
     new=$(git ls-tree $2 $submodule | awk '{print $3}') 
     (cd $submodule; compare $old $new $submodule) 
    done 
} 

compare "$1" "$2" 

wyjście to wszystkie pliki tak (chociaż bazowa jest modułem): HtmlTempl ates/Css/Screen.css Baza/PHP/klasy/Pomocnik.php

0

lipca 8,2017

Teraz dostać diff tym, że z submodule, można użyć polecenia -

git diff --submodule=diff 

Uwaga - ta została wprowadzona z Git 2.14.0

"git diff --submodule = diff" teraz recurses into nested submodules.

Powiązane problemy