26

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

4

1 に答える 1

32

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

new file mode 160000
index 0000000..4c4c5a2

したがって、「LATEST」バージョンをチェックアウトするのではなく、常に特定のSHA1をチェックアウトし、DETACHEDHEADモードでチェックアウトします(「デタッチされたサブモジュールHEADを実際にアタッチするHEAD方法」を参照してください。

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

サブモジュールの詳細と、サブモジュールを使用したくない理由(!)については、Amber YustSOでも)の冷静な記事「なぜあなたの会社はGitサブモジュールを使用すべきではないのか」を読んでください。

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

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

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

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

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

エラー...「痛い」。


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

于 2012-08-22T17:58:56.093 に答える