リポジトリのサブモジュールにデータを入力するには、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で何の害もなく廃止される可能性のある残酷なものです。どちらが本当ですか?
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
リポジトリに10個のサブモジュールがあり、これらの2つのサブモジュールのみに関心があるとします。このような場合、リモートリポジトリからこれら2つのサブモジュールのみから更新を取得することがあります。これらの2つのサブモジュールに対してgit init
コマンドを実行すると、git init
はそれらにのみ適用されるため、git submodule update --remote
はこれに適しています。
2つのワークフローデモを追加しました。
これは一般的な使用例の1つだと思います。
「my-project」のクローンを作成しました。
git clone https://example.com/demo/my-project
そして、その構造の表面は以下のようなものです。
.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
これで、必要なサブモジュールのみを初期化することがどれほど便利かがわかります。
私はこれが好きです。
「main-project」を複製します。
git clone https://example.com/demo/main-project
そして、その構造の表面は以下のようなものです。
「shared」という名前のディレクトリが表示されます。このワークフローにはルールがあります。プロジェクトでメインプロジェクトの共有コードを使用する場合は、プロジェクトをメインプロジェクトのサブモジュールとして作成する必要があります。
以下のように、エンティティクラスを共有ディレクトリに配置します。
サブモジュールのワークフローに戻ると、.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
で取得する必要があります。