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" теперь переписывается во вложенные подмодули.