2012-05-25 6 views
17

Ich möchte eine Liste aller Dateien erhalten, die sich zwischen zwei Commits einschließlich derjenigen in Submodulen geändert haben.git: Liste aller geänderten Dateien einschließlich derjenigen in Submodulen

Ich weiß, ich kann dies tun:

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

Es gibt eine Liste von Dateien, einschließlich dem Submodul-Pfad, aber nicht die Dateien innerhalb.

Beispiel: Ich habe ein Submodul aktualisiert. Ich habe das Superprojekt gemacht. Jetzt möchte ich eine Liste aller Dateien erhalten, die geändert wurden.

Kennen Sie einen Weg, dies zu tun?

Antwort

3

Also, das sehr einfach Skript, das alle Änderungen aufgeführt zu einer Revision im Vergleich

#!/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 

es ein Argument - Revision Sie vergleichen möchten. Stellen Sie sicher, dass es fgrep "Subproject", nicht fgrep "Submodule" gibt.

+0

Vielen Dank. Dies zeigt mir die Dateien, die sich seit dem letzten Commit der Submodule geändert haben. Aber wie bekomme ich alle Dateien, die sich geändert haben (einschließlich Submodulen), zwischen den Überarbeitungen des Superprojekts? – 4eyes

+0

Also hast du auch Submodule gemacht? Ich nehme an, dass Sie eine Art Skript benötigen ... – BlacKow

+0

ProTip ™: Speichern Sie dies als 'git-diff-submodule' und führen Sie es mit' git diff-submodule' – Zaz

13

Update-2017: I wie in "see diff of commit on submodule in gitlab" erwähnt,


Vorlage 2012 Antwort (pre 2017 Git 2,14)

Vielleicht eine einfache Linie wäre genug:

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

Das würde tatsächlich Dateien in Submodulen Withi auflisten n Submodule.
(Die --recursive Option stammt aus git1.7.3 +)

+0

'git submodule update --remote --recursive' gefolgt Mit dem Befehl 'foreach'' diff' wird nichts angezeigt (weil in jedem Submodul nur 'git diff' läuft). Wie können wir den Unterschied des Updates sehen, das wir gerade ausgeführt haben? – Zaz

+0

@Zaz ein 'update --remote' würde den gitlink ändern (SHA1, der das ausgetauschte Submodul Commit darstellt). Wenn Sie den vorherigen gitlink sha1 und den aktuellen gitlink sha1 (mit einem einfachen 'git diff' im Parent-Repo) erhalten, können Sie dann in das Submodul gehen und ein' git diff' zwischen diesen beiden SHA1 machen. – VonC

+0

Ich dachte, der Fragesteller suche nach einer Möglichkeit, das automatisch zu machen. – Zaz

3

Sie können herausfinden, welche Version ein Modul an, als ein Elternmodul gegeben war begehen, mit git ls-tree:

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

Also hier sind ein Skript das sollte man sich viel von dem Weg dorthin gelangen, bis zu der Ausgabeformatierung und so:

#!/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" 

Dies gibt alle Dateien wie diese (obwohl Base ist ein Modul): HtmlTempl ates/Css/Screen.css Basis/Php/Klassen/Helfer.php

0

8,2017 Juli

Jetzt ein diff einschließlich eines submodule zu erhalten, können Sie den Befehl verwenden können -

git diff --submodule=diff 

Hinweis - Das hat mit Git 2.14.0

eingeführt

"git diff --submodule = diff" rekuriert jetzt in verschachtelte Submodule.