Git: список всех измененных файлов, в том числе в подмодулях
Я хотел бы получить список всех файлов, которые изменили между двумя коммитами, в том числе в подмодулях.
Я знаю, что могу это сделать:
git diff --name-only --diff-filter=ACMR ${revision} HEAD
Он возвращает список файлов, включая путь подмодуля, но не файлы внутри.
Пример:
Я обновил подмодуль. Я совершил суперпроект. Теперь я хочу получить список всех файлов, которые были изменены.
Знаете ли вы, как это сделать?
Ответы
Ответ 1
Обновление 2017: как я упоминал в "см. разницу фиксации на подмодуле в gitlab",
Оригинальный ответ 2012 года (до 2017 Git 2.14)
Возможно, достаточно простой строки:
git submodule foreach --recursive git diff --name-status
Это фактически будет перечислять файлы в подмодулях внутри подмодулей.
(Опция --recursive
исходит от git1.7.3 +)
Ответ 2
Итак, очень простой script, в котором перечислены все изменения по сравнению с версией
#!/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
требуется один аргумент - пересмотр, с которым вы хотите сравнить.
Убедитесь, что есть fgrep "Subproject"
, а не fgrep "Submodule"
.
Ответ 3
Вы можете узнать, в какой версии был установлен подмодуль, как и для данного родительского модуля commit, используя git ls-tree
:
subcommit=$(git ls-tree $parentcommit $submodulepath | awk '{print $3}')
Итак, здесь script, который должен получить вам большую часть пути до форматирования вывода и т.д.
#!/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"
Это выведет все файлы, подобные этому (хотя Base является подмодулем):
HtmlTemplates/Css/screen.css
База/Php/Классы/helper.php
Ответ 4
Июль 8,2017
Теперь, чтобы получить diff, включая параметр submodule
, вы можете использовать команду -
git diff --submodule=diff
Примечание. Это было введено с помощью Git 2.14.0
"git diff --submodule = diff" теперь переписывается во вложенные подмодули.