update
サブモジュールがサブモジュールのアップストリーム リポジトリに存在しないコミット ID に更新されている場合にバウンスする gitのフックを作成しようとしています。別の言い方をすれば、サブモジュール ポインターに変更をプッシュする前に、サブモジュール リポジトリに変更をプッシュするようユーザーに強制したいと考えています。
1 つの警告:
- 親リポジトリと同じサーバーに存在する裸のアップストリームリポジトリを持つサブモジュールのみをテストしたい。そうしないと、git フック内から 'git clone' や 'git fetch' を呼び出すなどのクレイジーなことをしなければならなくなり、楽しくありません。
私はアイデアをいじっていますが、これを行うためのより良い方法があるに違いないと感じています. 更新フックで私が計画していたことは次のとおりです。
- フックに渡された refname をチェックして、 の下で何かを更新しているかどうかを確認し
refs/heads/
ます。そうでない場合は、早めに終了してください。 git rev-list
プッシュされているリビジョンのリストを取得するために使用します。- 各リビジョンについて:
git show <revision_id>
サブモジュールが更新されたかどうかを調べる正規表現を呼び出して使用します (「+Subproject commit [0-9a-f]+」を検索して)。- このコミットがサブモジュールを変更した場合は、
.gitmodules
その特定のコミットで見られるファイルの内容を取得します (git show <revision_id>:.gitmodules
)。 - 3.1 と 3.2 の結果を使用して、サブモジュールの URL とそれらの更新されたコミット ID のリストを取得します。
- 3.3 で作成されたこのリストを、サブモジュールの URL をファイルシステム上のローカルの裸の git リポジトリにマップする外部ファイルと照合して確認してください。
cd
3.4 で見つかったパスに移動し、実行git rev-parse --quiet --verify <updated_submodule_commit_id>
してそのコミットがそのリポジトリに存在するかどうかを確認します。そうでない場合は、ゼロ以外のステータスで終了します。
git rev-parse --quiet --verify <revision_id>:.gitmodules
(注: 3.2 の結果は、リビジョン間で出力が変わらない限り、リビジョン間でキャッシュできる可能性があると思います。ソリューションを単純化するために、この部分は省略しました。)
ええ、これはかなり複雑に思えます。私の生活をずっと楽にしてくれる内部の git コマンドがあるのではないかと思わずにはいられません。それとも、問題について考える別の方法があるのでしょうか?