web-dev-qa-db-ja.com

gitサブモジュールはどのように正確に機能しますか

.gitmodule fileは、モジュールリポジトリのURLのみを指定します。どうやって git submoduleダウンロードするバージョンを知っていますか?常に最新バージョンをチェックしているようです。それでは、開発者はどのようにしてメインプロジェクトとサブモジュール間の互換性を確保しますか?

23
dacongy

サブモジュールは、特別なモードを持つ特別なエントリとして表されます(gitlinkと呼ばれます。 " ネストされたgitサブモジュールのないリポジトリ? "):
( " git submodule commitを過ぎてチェックアウト "を参照)

new file mode 160000
index 0000000..4c4c5a2

したがって、「LATEST」バージョンをチェックアウトするのではなく、常に特定のSHA1をチェックアウトし、 DETACHED HEAD mode でチェックアウトします(「 作成方法」を参照)実際のHEAD "にアタッチされるHEADが切り離されたサブモジュール。

サブモジュールの本質 」で説明しているように、サブモジュールを更新できないという意味ではありません。

サブモジュールの詳細と、サブモジュールを使用したくない理由については、冷静な記事「 会社がGitサブモジュールを使用すべきでない理由)」をお読みください。 "、from Amber Yust (また SO )。

キックと笑いのためのたった1つの小さな抽出物(私の強調):

git submodule updateを呼び出すと、親リポジトリで各サブモジュールのSHA)を探し、それらのサブモジュールに移動して、対応するSHAをチェックアウトします。
通常のリポジトリでSHAをチェックアウトした場合と同様に、これによりサブモジュールが切り離されたHEAD状態になります。

その後、サブモジュールに変更を加えてコミットすると、Gitは喜んでコミットを作成します…そして、HEADが切り離されたままになります。これがまだどこに向かっているのか分かりますか?

別のサブモジュールの更新を含むいくつかの変更をマージするとします。独自のサブモジュールの変更を親プロジェクトにまだコミットしていない場合、Gitはサブモジュールでの新しいコミットを競合とは見なしません。また、git submodule updateを実行すると警告なしにコミットを喜んで消去し、マージしたばかりのブランチからのコミットに置き換えます

サブモジュールのreflogが有効になっているか、ターミナルのスクロールバックに古いコミットが残っていることを願っていますそれ以外の場合は、行ったすべての作業が失われます

エラー...「痛い」。


サブモジュールがブランチから最新のものを追跡できるようになったことに注意してください。「 gitサブモジュール追跡最新 "」を参照してください。

29
VonC