web-dev-qa-db-ja.com

親クローンの過去のコミットからgitサブモジュールに関連付けられたコミットIDを取得するにはどうすればよいですか?

親のクローンのコミットIDに基づいてサブモジュールのSHA-1コミットIDを決定する方法はありますか? 現在に関連付けられたSHA-1をgit submoduleで見つけられることはわかっています。

次に例を示します。

  • 先月に何度か変更された単一のサブモジュールfooのクローンがあります。
  • 親クローンに数週間前のreleased-1.2.3というタグがあります。このタグ付けされたコミットに関連するfooのSHA-1を知りたい.
  • 私は単にreleased-1.2.3をチェックアウトしてgit submoduleを使用して確認することもできますが、これを行う方法があるかどうか疑問に思いますwithoutスクリプトを実行するため、作業ツリーに影響しますそれ。

これを行うのは、親リポジトリ内の2つのコミット間のサブモジュール内のすべての変更を「差分」するスクリプトを作成するためです。つまり、「サブモジュールfoo内で変更されたファイルを親の2つのコミット間で教えてください」 」

45
davidA

git-ls-tree 特定のコミット中に特定のパスのSHA-1 IDが何であったかを確認します。

$ git ls-tree released-1.2.3 foo
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398  foo

(私の最初の考えはgit show released-1.2.3 foo、しかしそれは「致命的:悪いオブジェクト」で失敗します。)

出力をスクリプト化しているので、おそらくSHA-1 IDだけを取得したいと思うでしょう。例:

$ git ls-tree released-1.2.3 foo | awk '{print $3}'
c0f065504bb0e8cfa2b107e975bb9dc5a34b0398

また、gitの周りでスクリプトを作成するときは、マニュアルに記載されているように、 plumbing コマンドを使用してください。インターフェースはより安定していますが、より一般的な「磁器」コマンドは互換性のない方法で変更される可能性があります。

53
Josh Lee

これは私のために働きました:

$ git rev-parse released-1.2.3^{commit}:foo
<SHA1>

おそらく、スクリプトでの使用も非常に簡単です。

6
mash5

私は一つの有望な道を見つけました:

$ git log --raw <since>..<until> --submodule -- <path/to/submodule>

--rawオプションを使用すると、サブモジュールの関連するコミットに対応する(省略された)SHA-1 IDが出力されます。残念ながら、出力は非常に冗長であり、スクリプトで処理するにはいくつかの作業が必要になります。

私が本当に必要なのは、親コミットIDを指定すると、そのコミットの前にサブモジュールに最新の変更を提供するgit機能です。つまりその親コミットを実際にチェックアウトする場合、どのサブモジュールSHA-1 'git submodule update'がチェックアウトするか。

2
davidA

gitスレーブ(gits)があなたの答えかもしれません。

http://gitslave.sourceforge.net/

しかし、これはプレーンなgitでも実行できます。それほど簡単ではありません。

0
Adam Dymitruk

gitls-treeが仕事をします。ただし、サブコールを再帰的に表示するには、数回呼び出すか、-rを使用する必要がある場合があります。

    ├─project
    │  └─submodules
    │      ├─submodule_a
    │      ├─submodule_b
    │      ├─...

たとえば、そのようなプロジェクトディレクトリがあり、親モジュールにタグ名を付けたsubmodule_aのコミットIDが必要な場合。

git ls-tree v5.4.0

コミットIDではなく、ディレクトリsubmodulesのツリーIDを取得します。以下のようになります。

040000 tree e542bc1b084a0394ff16452c27df6572366e0009    submodules

ツリーIDをls-treeに入力するだけで、各サブモジュールの実際のコミットIDが取得されます。

git ls-tree e542bc

このようなものが得られます。

160000 commit 0f253bf94e0345600cb7a234a24eeec8ee3533bd  submodule_a
160000 commit 0edcbaf94e034987cb4eeec8ee3533bd12349ade  submodule_b

または単に使用する

git ls-tree v5.4.0 -r

すべてのエントリのツリーIDまたはコミットIDを確認します。

0
W.Perrin