gitaarik/git_submodules.md (日本語)
なぜサブモジュールなのですか?
Gitでは、リポジトリにサブモジュールを追加できます。 これは基本的にメインリポジトリに埋め込まれたarepositoryです。 これは非常に有用です。 サブモジュールを使用するいくつかの利点:
-
コードを異なるリポジトリに分けることができます。
大きなコンポーネントを持つコードベースがある場合は、acomponentをサブモジュールにすることができます。 このようにして、gitログがクリーンになります(コミットは特定のコンポーネントに固有です)。,
-
サブモジュールを複数のリポジトリに追加できます。
同じコンポーネントを共有する複数のリポジトリがある場合に便利です。 このアプローチを使用すると、サブモジュールとして追加されたすべてのリポジトリ内のthosecomponentsを簡単に更新できます。これは、コードをtherepositoriesにコピーして貼り付けるよりもはるかに便利です。
Basics
Gitでサブモジュールを追加するときは、thesubmoduleのコードをメインリポジトリに追加しないで、メインリポジトリに追加されたthesubmoduleに関する情報のみを追加します。, この情報は、サブモジュールが指しているコミットを記述します。 このようにして、サブモジュール”srepository”が更新されると、サブモジュールのコードは自動的に更新されません。 これは、あなたのコードがサブモジュールの最新のコミットで動作しない可能性があるため、unexpectedbehaviourを防止するため、これは良いことです。,
サブモジュールの追加
次のようにリポジトリにサブモジュールを追加できます。
デフォルト設定では、awesome_submodule.git
リポジトリのコードをpath_to_awesome_submodule
ディレクトリにチェックアウトし、このサブモジュールについての情報をメインリポジトリに追加します。これは、このコマンドが実行された時点でのデフォルトブランチ(通常はmaster
ブランチ)の現在のコミットになります。,
この操作の後、git status
を実行すると、Changes to be committed
リスト:.gitmodules
ファイルとサブモジュールへのパスが表示されます。 これらのファイ
サブモジュールのコードの取得
ある人が新しいサブモジュールを作成した場合、チーム内の他の人がこのサブモジュールを開始する必要があります。 まず、サブモジュールに関する情報を取得する必要がありますが、これは通常のgit pull
によって取得されます。, 新しいサブモジュールがある場合は、git pull
の出力に表示されます。 次に、それらを開始する必要があります:
これにより、サブモジュールからすべてのコードがプルされ、それが設定されているディレ
サブモジュールを使用するリポジトリを複製した場合は、このコマンドを実行してサブモジュールのコードを取得する必要があります。 これは自動的にgit clone
によって行われません。
サブモジュールでの更新のプッシュ
サブモジュールは単なる別のリポジトリです。, 変更を行いたい場合は、このリポジトリで変更を行い、通常のGitリポジトリのようにプッシュする必要があります(サブモジュールのディレクトリでgitコマンドを実行するだけです)。 ただし、mainrepositoryにサブモジュールのリポジトリを更新したことを知らせ、サブモジュールのリポジトリの最新のコミットを使用させる必要があります。 サブモジュール内で新しいコミットを行うと、メインリポジトリは古いコミットを指し示すからです。,
したがって、メインリポジトリでもこれらの変更を行いたい場合は、メインリポジトリにthesubmoduleの最新のコミットを使用するように指示する必要があ 今どのようにこれを行うのですか?
だから、あなたはサブモジュールのリポジトリに変更を加え、そのリポジトリにそれらをコミットしました。 Mainrepositoryでgit status
を実行すると、サブモジュールがリストChanges not staged for commit
にあり、テキスト(modified content)
その背後にあります。このコードをサブモジュールをチェックアウトにadifferentコミットのリポジトリを指す。, メインリポジトリがこの新しいコミットを指している場合は、git add
でこの変更を追加してから、コミットしてプッシュします。
サブモジュールを最新の状態に保つ
誰かがサブモジュールを更新した場合、他のチームメンバーはサブモジュールのコードを更新する必要があります。 これは、git pull
によって自動的に行われるわけではありません。git pull
サブモジュールが別のコミットを指している情報のみを取得するためですが、サブモジュールのコードは更新されません。, サブモジュールのコードを更新するには、次を実行する必要があります。
このコマンドを実行しないとどうなりますか?
このコマンドを実行しない場合、サブモジュールのコードは古いコミットにチェックアウトされます。 git status
を実行すると、Changes not staged for commit
テキスト(modified content)
その背後にあるリストにサブモジュールが表示されます。 これは、submoduleのコードを変更したためではなく、そのコードがdifferentcommitにチェックアウトされているためです。 したがって、Gitはこれを変更と見なしますが、実際にはサブモジュールのコードを更新しませんでした。, したがって、サブモジュールを使用して作業している場合は、サブモジュールを最新の状態に保つことを忘れないでください。
すべての人にとって簡単になります
サブモジュールを開始して更新するのを忘れると迷惑になることがあります。 幸いなことに、それを簡単にするためのいくつかのトリックがあります:
これにより、サブモジュールが更新され、まだ開始されていない
サブモジュールの内部にサブモジュールを持つこともできます。, この場合、サブモジュールを再帰的に更新/開始する必要があります。
これは入力するのがたくさんあるので、エイリアスを作成できます。
git update
を実行するたびに、git pull
andagit submodule update --init --recursive
、したがって、プロジェクト内のすべてのコードを更新します。