Je voudrais obtenir une liste de tous les fichiers, qui ont changé entre deux commits, y compris ceux des sous-modules.
Je sais que je peux le faire:
git diff --name-only --diff-filter=ACMR ${revision} HEAD
Il renvoie une liste de fichiers, y compris le chemin du sous-module, mais pas les fichiers qu'il contient.
Exemple: j'ai mis à jour un sous-module. J'ai commis le super-projet. Maintenant, je veux obtenir une liste de tous les fichiers qui ont été modifiés.
Connaissez-vous un moyen d'y parvenir?
Mise à jour 2017: comme je l'ai mentionné dans " voir diff de commit sur le sous-module dans gitlab ",
Git 2.11 (novembre 2016) présente
git diff --submodule=diff
Git 2.14 (Q3 2017) améliorera cela en se reproduisant en sous-modules imbriqués.
Voir commit 5a52214 (04 mai 2017) par Stefan Beller (stefanbeller
) .
(Fusionné par Junio C Hamano - gitster
- in commit a531ecf , 29 mai 2017)
Réponse originale de 2012 (avant 2017 Git 2.14)
Peut-être qu'une simple ligne suffirait:
git submodule foreach --recursive git diff --name-status
Cela répertorierait en fait des fichiers dans des sous-modules dans des sous-modules .
(Le --recursive
l'option vient de git1.7.3 +)
Vous pouvez savoir à quelle version se trouvait un sous-module, lors de la validation d'un module parent donné, en utilisant git ls-tree
:
subcommit=$(git ls-tree $parentcommit $submodulepath | awk '{print $3}')
Voici donc un script qui devrait vous y aider, jusqu'au formatage de sortie et autres:
#!/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"
Cela produira tous les fichiers comme celui-ci (bien que Base soit un sous-module): HtmlTemplates/Css/Screen.css Base/Php/Classes/Helper.php
Ainsi, le script très simple qui répertorie toutes les modifications par rapport à une révision
#!/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
cela prend un argument - la révision avec laquelle vous voulez comparer. Assurez-vous qu'il y a fgrep "Subproject"
, ne pas fgrep "Submodule"
.
Une variante Windows de https://stackoverflow.com/a/13169898/5438298 par Jamey Sharp serait
@echo off
if NOT %1.==. goto has_rev1
@echo git diff --name-only including submodules
@echo usage:
@echo ^ ^ %~n0 ^<revision1^> [^<revision2^>^|HEAD]
@exit /b 1
:has_rev1
setlocal
set rev1=%1
if %2.==. (set rev2=HEAD) else (set rev2=%2)
call :show_diff %rev1% %rev2%
exit /b
::eof
:show_diff
setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=*" %%l in ('git --no-pager diff --name-only --ignore-submodules^=all --line-prefix^=%3 %1 %2') do set fwds=%%l & set bcks=!fwds:/=\! & echo !bcks!
endlocal
::git submodule is too slow for this
::for /f "tokens=2" %%d in ('git submodule') do call :subm %1 %2 %%d %3
if exist .gitmodules for /f "tokens=1,3*" %%p in (.gitmodules) do if %%p.==path. call :subm %1 %2 %%q %3
exit /b
::show_diff
:subm
setlocal
for /f "tokens=3" %%r in ('git ls-tree %1 %3') do set rev1=%%r
for /f "tokens=3" %%r in ('git ls-tree %2 %3') do set rev2=%%r
set fwdslash=%3
set bckslash=%fwdslash:/=\%
pushd %bckslash%
call :show_diff %rev1% %rev2% %4%bckslash%\
popd
endlocal
exit /b
::subm
(notez qu'il pourrait avoir besoin de quelques guillemets supplémentaires pour que les espaces dans les noms des sous-modules fonctionnent).
8 juillet 2017
Maintenant, pour obtenir un diff incluant celui d'un submodule
, vous pouvez utiliser la commande -
git diff --submodule=diff
Remarque - Cela a été introduit avec Git 2.14.
"git diff --submodule = diff" revient maintenant en sous-modules imbriqués.
Il y a un problème avec git diff --submodule=diff
: il ne transmet pas toutes les options git cli que l'utilisateur a spécifiées aux différences générées pour chaque sous-module. Par exemple git diff --binary --no-renames --submodule=diff ...
ne passera pas --binary
et --no-renames
en diff git en ligne pour les sous-modules.
https://github.com/git/git/blob/fe8321ec057f9231c26c29b364721568e58040f7/submodule.c#L62
EDIT: solution de contournement trouvée pour passer --no-renames en utilisant git-config : git -c diff.renames=false diff --submodules=diff COMMIT COMMIT
.
Mais il n'y a toujours aucun moyen de passer --binary
aux sous-modules diffs, car il n'y a pas une telle option dans git-config.