2012-05-25 10 views
17

Me gustaría obtener una lista de todos los archivos, que han cambiado entre dos confirmaciones, incluidas las de los submódulos.git: lista de todos los archivos modificados incluidos los de los submódulos

Sé que puedo hacer esto:

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

Devuelve una lista de archivos, incluyendo el submódulo-camino, pero no los archivos dentro.

Ejemplo: He actualizado un submódulo. Me comprometí con el superproyecto. Ahora quiero obtener una lista de todos los archivos que se han modificado.

¿Conoces alguna manera de hacerlo?

Respuesta

3

Por lo tanto, el script muy sencillo que enumera todos los cambios en comparación a una revisión

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

que toma un argumento - revisión que desea comparar. Asegúrese de que hay fgrep "Subproject", no fgrep "Submodule".

+0

Gracias. Esto me mostrará los archivos que han cambiado desde la última confirmación de los submódulos. Pero, ¿cómo obtengo todos los archivos que han cambiado (incluidos los submódulos) entre las revisiones del superproyecto? – 4eyes

+0

¿Entonces también estabas comprometiendo submódulos? Supongo que necesitarás algún tipo de script ... – BlacKow

+0

ProTip ™: guárdalo como 'git-diff-submodules' y ejecútalo con' git diff-submodules' – Zaz

13

Actualización 2017: como he mencionado en "see diff of commit on submodule in gitlab",


original 2012 respuesta (pre 2017 Git 2,14)

Tal vez una simple línea sería suficiente:

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

Eso realmente enumeraría los archivos en los submódulos withi n submódulos.
(La opción --recursive proviene de git1.7.3 +)

+0

'git submodule update --remote --recursive' seguido por su comando 'foreach'' diff' no muestra nada (porque simplemente ejecuta 'git diff' en cada submódulo). ¿Cómo podemos ver la diferencia de la actualización que acabamos de ejecutar? – Zaz

+0

@Zaz y 'update --remote' cambiaría el gitlink (SHA1 que representa la confirmación del submódulo desprotegido). Si puede obtener el gitlink sha1 anterior y el actual (con un simple 'git diff' en el repositorio padre), puede ir al submódulo y hacer un' git diff' entre esos dos SHA1. – VonC

+0

Pensé que el que preguntaba estaba buscando una forma de hacerlo automáticamente. – Zaz

3

Puede averiguar qué versión de un submódulo estaba, como de un módulo matriz dada cometió, utilizando git ls-tree:

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

Así que aquí es una secuencia de comandos eso ayudaría a que la mayor parte del camino, hasta el formato de salida y dicho:

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

esta es la salida de todos los archivos como éste (aunque la base es un submódulo): HtmlTempl ates/Css/Screen.css Base/Php/Clases/Ayudante.php

0

julio 8,2017

ahora para obtener un diff entre ellas la de un submodule, puede utilizar el comando -

git diff --submodule=diff 

Nota - Este ha sido introducido con Git 2.14.0

"git diff --submodule = diff" ahora vuelve a aparecer en los submódulos anidados.

Cuestiones relacionadas