web-dev-qa-db-ja.com

「git submodule init」のポイントは何ですか?

バックグラウンド

リポジトリのサブモジュールにデータを入力するには、1つ 通常呼び出します

git submodule init
git submodule update

この使用法では、git submodule initは1つのことだけを行うようです。.git/configに既に存在する情報を.gitmodulesに設定します。

そのポイントは何ですか?

git submodule updateは単に.gitmodulesからの情報を使用できませんでしたか?これにより、両方が回避されます。

  • 不要なコマンド(git submodule init);そして
  • 不要なデータの複製(.gitmodulesコンテンツから.git/configへ)。

質問

どちらか:

  • 私が知らないgit submodule initのユースケースがあります(その場合、私に教えてください!);または
  • git submodule initは、Gitで何の害もなく廃止される可能性のある残酷なものです。

どちらが本当ですか?

35
sampablokuper

git submoduleを読み取る ドキュメント 、そこには)スタンドアロンのコマンドとしてのgit submodule initの存在を表面上正当化するユースケースがあります。

リポジトリを複製したユーザーが、アップストリームリポジトリで指定されたものとは異なるサブモジュールのURLを使用する場合、そのユーザーは次のことができます。

git submodule init
vim .git/config # Alter submodule URL as desired, without changing .gitmodules
                # or polluting history.
git submodule update
14
sampablokuper

リポジトリに10個のサブモジュールがあり、これらの2つのサブモジュールのみに関心があるとします。このような場合、リモートリポジトリからこれら2つのサブモジュールのみから更新を取得することがあります。これらの2つのサブモジュールに対してgit initコマンドを実行すると、git initはそれらにのみ適用されるため、git submodule update --remoteはこれに適しています。


2つのワークフローデモを追加しました。

Workflow1:サブモジュールは、いくつかのプロジェクトが使用するライブラリです。

これは一般的な使用例の1つだと思います。

「my-project」のクローンを作成しました。

git clone https://example.com/demo/my-project

そして、その構造の表面は以下のようなものです。

Enter image description here

.gitmodulesの内容

[submodule "lib1"]
    path = lib1
    url = https://example.com/demo/lib1
[submodule "lib2"]
    path = lib2
    url = https://example.com/demo/lib2
[submodule "lib3"]
    path = lib3
    url = https://example.com/demo/lib3
[submodule "lib4"]
    path = lib4
    url = https://example.com/demo/lib4

Lib1とlib2を参照するコードcode1.jsをリファクタリングする必要があるため、lib3とlib4を複製およびチェックアウトする必要はありません。したがって、次のコマンドを実行するだけです。

git submodule init lib1 lib2

.git/configの内容を見てみましょう

...
[submodule "lib1"]
    active = true
    url = https://example.com/demo/lib1
[submodule "lib2"]
    active = true
    url = https://example.com/demo/lib2

これは、「lib1とlib2をexample.com/demoから更新する準備ができている」などのことを意味します。

この時点で、lib1およびlib2ディレクトリは空です。 1つのコマンドでlib1とlib2を複製およびチェックアウトできます。

git submodule update

インポートエラーなしでcode1.jsをリファクタリングできるようになりました。

サブモジュールは、特定のコミットへの単なる参照です。したがって、ライブラリを新しいバージョンに更新する場合は、参照を更新する必要があります。以下のコマンドで実行できます。

git submodule update --remote

これで、必要なサブモジュールのみを初期化することがどれほど便利かがわかります。

ワークフロー2:各サブモジュールはプロジェクトであり、1つの大きなトッププロジェクトに含まれています。

私はこれが好きです。

「main-project」を複製します。

git clone https://example.com/demo/main-project

そして、その構造の表面は以下のようなものです。

Enter image description here

「shared」という名前のディレクトリが表示されます。このワークフローにはルールがあります。プロジェクトでメインプロジェクトの共有コードを使用する場合は、プロジェクトをメインプロジェクトのサブモジュールとして作成する必要があります。

以下のように、エンティティクラスを共有ディレクトリに配置します。

Enter image description here

サブモジュールのワークフローに戻ると、.gitmodulesの内容は次のようになります。

[submodule "sub-project1"]
    path = sub-project1
    url = https://example.com/demo/sub-project1
[submodule "sub-project2"]
    path = sub-project2
    url = https://example.com/demo/sub-project2
[submodule "sub-project3"]
    path = sub-project3
    url = https://example.com/demo/sub-project3
[submodule "sub-project4"]
    path = sub-project4
    url = https://example.com/demo/sub-project4

今回は、メインプロジェクトの共有ディレクトリにあるコードをリファクタリングし、サブプロジェクト1とサブプロジェクト2のみが共有コードを参照することを知っています。つまり、サブプロジェクト3とサブプロジェクトを複製してチェックアウトする必要はありません。プロジェクト4。したがって、次のコマンドを実行するだけです。

git submodule init sub-project1 sub-project2

そして、workflow1で説明したように、以下のコマンドを実行して、それらを複製およびチェックアウトする必要があります。

git submodule update

この場合、git submodule update --remoteを実行しますか?または、共有ディレクトリのコードをリファクタリングするためにサブモジュールを初期化および更新する必要がありますか?はい。共有コードのリファクタリング後にサブモジュールでテストを実行する必要があり、リファクタリング中にサブモジュールの更新がコミットされてリモートリポジトリにプッシュされる場合、git submodule update --remoteで取得する必要があります。

35
Nigiri