親のクローンのコミット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つのコミット間で教えてください」 」
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 コマンドを使用してください。インターフェースはより安定していますが、より一般的な「磁器」コマンドは互換性のない方法で変更される可能性があります。
これは私のために働きました:
$ git rev-parse released-1.2.3^{commit}:foo
<SHA1>
おそらく、スクリプトでの使用も非常に簡単です。
私は一つの有望な道を見つけました:
$ git log --raw <since>..<until> --submodule -- <path/to/submodule>
--rawオプションを使用すると、サブモジュールの関連するコミットに対応する(省略された)SHA-1 IDが出力されます。残念ながら、出力は非常に冗長であり、スクリプトで処理するにはいくつかの作業が必要になります。
私が本当に必要なのは、親コミットIDを指定すると、そのコミットの前にサブモジュールに最新の変更を提供するgit機能です。つまりその親コミットを実際にチェックアウトする場合、どのサブモジュールSHA-1 'git submodule update'がチェックアウトするか。
git
ls-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を確認します。