21

リポジトリに2つのバージョンがあるとします...それぞれが次のようにタグ付けされています:

  • タグ1
  • Tag2

ここで、コミットがサブモジュール参照を更新して、Tag1とTag2の間の新しいサブモジュールコミットを指すと仮定します。次のコマンドを実行すると、次のようになります。

# show commits between these two tags
git log Tag1..Tag2


commit be3d0357b93322f472e8f03285cb3e1e0592eabd
Author: James Johnston <snip>
Date:   Wed Jan 25 19:42:56 2012 +0000

    Updated submodule references.

この場合、唯一の変更はサブモジュールの更新でした。サブモジュールのコミットを親リポジトリのコミットとインターリーブするにはどうすればよいですか?

具体的には、この例では、親リポジトリがサブモジュールのSubTag5タグを指していると仮定します。サブモジュールの後半の2つのコミットは、SubTag6タグです。示されているコミットは、SubTag5ではなくSubTag6を指すようにサブモジュールポインターを更新しました。私がやりたいのはgit log、すでに印刷されているコミットに加えて、サブモジュールをSubTag5からSubTag6に移動させた2つのサブモジュールコミットも印刷することです。

4

4 に答える 4

18

スーパープロジェクトでサブモジュールが変更されたときに、関連するサブモジュールのコミットをインターリーブする ASCII コミット グラフ (gitk に類似) を作成する単純な bash コマンドを次に示します。コミットごとに完全なパッチを出力し、grep を使用してパッチの内容を除外し、要約行とサブモジュールの変更のみを残します。

git log --graph --oneline -U0 --submodule Tag1..Tag2 | grep -E '^[*| /\\]+([0-9a-f]{7} |Submodule |> |$)'

次のような出力が生成されます。

* 854407e Update submodule
| Submodule SUB 8ebf7c8..521fc49:
|   > Commit C
* 99df57c Commit B
* 79e4075 Commit A
于 2014-10-29T20:28:03.350 に答える
17

サブモジュールの変更を表示できますが、使用時のみgit log -pです。次のコマンドは、各コミットとサブモジュールの変更の完全な差分を表示します。

git log -p --submodule=log

サブモジュールのコミット メッセージは次のように一覧表示されます。

Submodule <submodule-name> <starting-commit>..<ending-commit>:
> Commit message 1
> Commit message 2
...
> Commit message n

各コミットの完全な差分を読むことに興味がない場合は、それらの部分を照合して除外できます。

git log -p --submodule=log | awk '
/^commit/ { add=1 } # Start of commit message
/^diff --git/ { add=0 } # Start of diff snippet
{ if (add) { buf = buf "\n" $0 } } # Add lines if part of commit message
END { print buf }
'
于 2012-08-02T23:16:12.417 に答える