41

サブモジュール内のものを含む2つのコミットをツイートに変更したすべてのファイルのリストを取得したいと思います。

私はこれができることを知っています:

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

submodule-pathを含むファイルのリストを返しますが、その中のファイルは返しません。

例:サブモジュールを更新しました。私はスーパープロジェクトをコミットしました。ここで、変更されたすべてのファイルのリストを取得したいと思います。

これを行う方法を知っていますか?

4

7 に答える 7

48

2017年更新:「gitlabのサブモジュールのコミットの差分を参照」で述べたように、


元の2012年の回答(2017年以前のGit 2.14)

多分単純な行で十分でしょう:

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

それは実際にはサブモジュール内のサブモジュール内のファイルをリストします。
(--recursiveオプションは git1.7.3+ からのものです)

于 2012-10-27T13:39:54.220 に答える
5

以下を使用して、特定の親モジュールのコミット時点でのサブモジュールのバージョンを確認できますgit ls-tree

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

したがって、出力の書式設定などに至るまで、多くのことを行うスクリプトを次に示します。

#!/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 Base/Php/Classes/Helper.php

于 2012-11-01T01:46:28.003 に答える
3

したがって、リビジョンと比較してすべての変更をリストする非常に単純なスクリプト

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

1 つの引数を取ります - 比較したいリビジョンです。fgrep "Subproject"がないことを確認してくださいfgrep "Submodule"

于 2012-05-26T01:15:50.693 に答える
-1

使用できます

git -c color.diff=false diff --submodule=diff HEAD~1 HEAD | sed -n -e s/^diff\ --git\ a\\///p

ファイルのリストを取得するだけです(参照の例としてHEAD〜1とHEADを使用)。

私は好む

git -c color.diff=false diff --submodule=diff HEAD~1 HEAD | grep -E "^(diff|Submodule)\ "

サブモジュールごとにファイルをグループ化します。端末によっては、次の注釈に示すように、「--no-pager」オプションを使用することが重要な場合があります。

備考: ファイル内の完全に色分けされた diff が気に入っています。これは、後で表示するために「html 化」できます。

git -c color.diff=always --no-pager diff --submodule=diff HEAD~1 HEAD > diffFileName
于 2020-10-23T11:04:36.223 に答える