ウェブサイト検索

Gitリポジトリ内のディレクトリをサブモジュールに変換する方法


Gitサブモジュールは、リポジトリ内のリポジトリのようなもので、プロジェクトに外部のコードライブラリや依存関係を含めることができ、モジュールのバージョン管理をプロジェクト自体にリンクすることなく実現します。

Gitサブモジュールは、リポジトリ内のリポジトリのようなもので、プロジェクトに外部コードライブラリや依存関係を含めることを可能にします。これにより、モジュールのバージョン管理をプロジェクト自体にリンクすることなく、モジュールを独立させて簡単に更新できるようになります。また、ディレクトリを新しいサブモジュールに変換することも簡単です。

Gitにおけるサブモジュールとは何ですか?

サブモジュールは、別のGitリポジトリ内に埋め込まれたGitリポジトリです。これにより、別のプロジェクトのコードを依存関係として含めることができる一方で、それ自身のバージョン管理を維持することができます。

親リポジトリをクローンすると、サブモジュールリポジトリも自動的にクローンされます。これは、サブモジュールのコードとGitの履歴がメインのバージョン管理とは別に保持され、ライブラリを利用する複数のリポジトリのために更新できることを意味します。

サブモジュールの代替手段は、ライブラリをNPM、Maven、またはNuGetのようなパッケージマネージャーにパッケージとして公開することです。しかし、これはすべての種類のプロジェクトに適しているわけではなく、プライベートコードで作業している場合は、プライベートパッケージレジストリを設定する必要があり、これはライブラリのソースコードをサブモジュールとして埋め込むよりも複雑になることがあります。

既存のディレクトリをサブモジュールに変える際の主な問題の一つは、サブモジュールが外部で管理されるべきだということです。Gitは、サブモジュールのために新しい空のディレクトリを作成し、そのサブモジュールをプロジェクトにクローンすることを期待します。コードを新しいフォルダにコピーすることもできますが、その際に関連するすべてのGit履歴を失うことになります。これは大規模なプロジェクトでは非常に有害です。代わりに、リポジトリをクローンし、不必要なコードをフィルタリングし、新しい履歴を新しいサブモジュールにプッシュします。

ディレクトリをサブモジュールに変換する方法

最初のステップは、サブモジュールのために新しいリポジトリを作成することです。これは通常、GitHubのようなGitホスティングサービス上で行われますが、あなたのコンピューター上にローカルリポジトリを作成することもできます。

次に、サブモジュールリポジトリを作成するために、メインリポジトリの新しいコピーを取得したいと思います。

git clone git@github.com:username/repository.git submodule-repo 

cd submodule-repo

次に、サブモジュールに関係のないすべてのものをフィルタリングしたいでしょう。これにより、サブモジュールに含まれているコードに関連しないすべてのコミット履歴が削除されます。これは破壊的操作なので、自分のリポジトリのコピーで行っていることを確認してください。本体ではなく。

git filter-branch --subdirectory-filter submoduledirectory -- --all

ディレクトリ内にあったコードだけが残り、それに関連するコミットのみが含まれます。これにより、そのサブモジュールに関連するすべてのGit履歴を移行することができます。

このモジュールディレクトリのリモートURLを新しいサブモジュールリポジトリ、通常は「origin」と呼ばれるものに変更する必要があります。

git remote set-url origin https://github.com/new-repository.git

それから、通常通りに履歴をプッシュすることができます。

git push -u origin main

新しいサブモジュールの追加

メインプロジェクトに戻ると、サブモジュールを追加したいと思います。

まず、親リポジトリからサブモジュールに変えたいディレクトリのトラッキングを停止する必要があります。それは Git のバージョン履歴にまだ存在し、新しいモジュールリポジトリに anyway とにかく追加されました。

rm -rf directory_name

次に、git submodule addコマンドを使用して、Githubで作成したサブモジュールリポジトリのリモートURLを追加できます。

git submodule add git@github.com:username/repository.git directory_name

このコマンドを実行すると、Gitは親リポジトリ内に新しいサブモジュールディレクトリを作成し、そのディレクトリにサブモジュールリポジトリをクローンします。また、モジュールフォルダの追跡も再開します。

サブモジュールを更新するには、git submodule update コマンドを使用できます。

git submodule update --remote submodule_name

関連記事: