GITの説明:Gitサブモジュールを用いたプロジェクトアンブレラ構造


ほとんどの場合、開発者チームは、プロジェクトが必要とするさまざまな部分を処理するために、Git構造を実装するという決定に直面するでしょう.いくつかのチームがmonorepoを選ぶ一方、他の人はそれをサブプロジェクト、例えばUIのためのリポジトリとAPIのための別のものに分解すると決めます.両方のgit構造は利点と欠点を有する.
Monoreposはコード共有、コードの重複、単一のビルド、および原子コミットのような利点を提供します.しかし、monoreposはまた、木の関係のない部分の多数のコミットに対処して、コードをクローニングして、取り出して、押すとき、潜在的パフォーマンス問題と同様に.一方、サブプロジェクトを維持するには、複数のリポジトリをクローンに変換し、複数のセットをインストールしてビルドし、維持する複数のディレクトリに従ってください.
最近、私は、UIとAPIの外部リポジトリの特定のコミットを指す中央アンブレラリポジトリを作成するために、Gitサブモジュールの使用に導入されました.このアンブレラ構造を使用すると、1つの中央にあるドキュメントと構成を管理するなどのモノポールを使用する利点のいくつかのサブプロジェクトの構成を維持することができ、サブプロジェクトを含むプロジェクト全体を1つのステップでプルすることができます.このポストは議論するbenefits of using an umbrella repository structure using Git Submodules , the struggles that come with it , とcommands that you need to learn to start using this Git structure .

利益


サブプロジェクトの構成.プロジェクトのさまざまな部分のための複数のリポジトリを持つことは、“コードへの必要”の基礎に制限されたアクセスを与えることができます.たとえば、フロントエンド開発者があなたのチームにUI実装を高速化するために数週間の間追加されている場合があります.この開発者は簡単にAPIを台無しにすることなく、UIリポジトリだけをプルすることができます.
連続開発.Gitサブモジュールを使用して提案されたアンブレラ構造は、各リポジトリに独自の展開プロセスを持つことができるサブプロジェクトの構成を保持します.
つの場所のドキュメンテーション.アンブレラのリポジトリでは、プロジェクト全体に適用されるドキュメントを1つの場所に格納するスペースを提供します.私は個人的にグローバルなプロジェクトを構築し、実行するための手順を使用してグローバルなマークダウンファイルを維持するようにDocker 各リポジトリ内のアンブレラリポジトリとマークダウンファイルで、それぞれのサブプロジェクトをローカルでインストールして使用する方法について説明します.
つの場所の構成.我々のチームは、アプリケーションを作成、配備、実行するためにDockerコンテナを使用します.アンブレラリポジトリは、Aを置く素晴らしい場所ですdocker-compose.yml つのコマンドでデータベースイメージ、API、およびUI環境を構築して実行するファイルです.
原子コードプル.を使用して--recurse-submodules アンブレラのリポジトリをクローニングするときに、1つのコマンドでサブモジュールを含むすべてのネストしたディレクトリを取得します.言い換えれば、あなたのUIとAPIリポジトリを一度にすべて取得します.

闘争


命令でgitサブモジュールの使用を指定する必要があります.あなたのチームがこのGit構造に慣れていないならば、彼らは、彼らを正しくクローン化するか、扱う方法を知らないでしょう.Gitはデフォルトでサブモジュールの内容をダウンロードしませんので、この情報をREADMEに含めるようにしてください.
サブモジュール更新のマニュアル検索gitは自動的に更新をサブモジュールに登録しません.あなたが実行する必要がありますgit submodule update --remote サブモジュールに対する変更を見るには.
単純な実装のみ.これまで、私はこの傘構造を使用して、プロジェクトごとにUIとAPIリポジトリをリンクしました.私は2つ以上のサブモジュールを維持する方法を挑戦することができますし、別の実装を調べる必要があります.
Dockerを使うときにはたいてい役に立ちます.あなたがDockerを使用していないならば、この構造の利益は衝撃的であるかもしれません.

コマンド


この傘構造を実装するためのツールボックスにある可能性とコマンドを議論しましょう.
  • Create a project with submodules
  • Rename a submodule
  • Clone a project with submodules
  • Work in a submodule
  • Check and pull submodule updates
  • Update umbrella project with latest submodule commits
  • サブモジュールでプロジェクトを作成する


    この操作を明確に説明するために、アンブレラUIとアンブレラAPIと呼ばれる2つのリポジトリとしてアンブレラというリポジトリを作成します.あなたはそれらをチェックアウトすることができますhere .
    cd[umbrella-project-name]
    git submodule add [[email protected]:your-account/umbrella-ui.git] [name]
    

    Note: the name parameter is optional. If you don’t pass a name, you will get the submodule repository name. In this case, I will give it the “ui” name parameter because I don’t want a redundant directory name like “umbrella-ui” inside my “umbrella” project.


    を実行するls -a 新しいディレクトリを参照するコマンドui と呼ばれる新しいファイル.gitmodules . The .gitmodules ファイルは、メインプロジェクトとそのサブモジュール間のマッピングを格納する構成です.以下のようになります.
    [submodule “ui”]
    path = ui
    url = [email protected]:your-account/umbrella-ui.git
    
    この変更をコミットしてプッシュすると、サブモジュールのマスターブランチの最新のコミットを指すサブモジュールのフォルダが表示されるはずです.

    サブモジュールの名前を変更する


    サブモジュールを追加する際に名前を渡すのを忘れてしまった場合は、以下のコマンドを使ってサブモジュールのディレクトリ名を変更することができます.
    git mv [old-name] [new-name]
    

    サブモジュールでプロジェクトをクローンする


    次のコマンドを渡して、プロジェクトとそのサブモジュールを自動的にクローンします.あなたが通るならば--recurse-submodules フラグを指定します.
    git clone --recurse-submodules [git-repo-url]
    

    サブモジュールで働く


    これは通常のリポジトリを扱うときに続くプロセスです.変更を行い、それらをコミットし、リモートにプッシュします.

    サブモジュール更新をチェック


    サブモジュールの変更がリモートリポジトリにプッシュされると、コミットポインタが現在の状態になるので、これらの変更をチェックしてアンブレラリポジトリを更新する必要があります.
    この概念を理解するために、私はあなたにumbrella-api リポジトリが更新され、最後のコミットは6302c8…
    さあ、傘のリポジトリを見てみましょうapi サブモジュールは、umbrella-api . 代わりに、それは古いコミットを指している15a146…
    アンブレラディレクトリからすべてのサブモジュールで作られた変更を直接以下のコマンドでプルできます.
    // fetch all new updates in submodules
    git submodule update --remote
    
    // see which submodule has been modified
    git status
    

    // see all new commits that have been pulled down
    git diff
    

    最新のサブモジュールコミットを持つ更新アンブレラプロジェクト


    我々のサブモジュールで作られた変更を引っ張ったので、我々は我々の傘プロジェクトポインタを更新する必要があります.これは非常に重要です、なぜなら、誰かがこの状態で我々のアンブレラプロジェクトをクローンするならば、彼らは我々のサブモジュールの下で最新のコードを得ません.
    // add all submodules changes
    git add .
    
    // commit new pointers
    git commit -m “Update submodule pointers”
    
    // publish the changes
    git push origin master
    

    Note: You can also use the following shortcut to pull the latest changes made to your submodules and get your umbrella project to point to the last commits.


    git submodule update --remote --merge
    
    現在、我々の傘プロジェクトは、サブモジュール、傘UIと傘APIの最新のコミットを示します.

    同様のアンブレラ構造でgitサブモジュールを使用しましたか?そうでなければ、それはあなたの興味を火花と希望を試してみる.
    読んで、好きにしてください、そして、私のGitがシリーズポストを説明したことを共有して、それは本当に私に多くを意味します.私は一緒にそれらを入れ、お客様のご質問やご提案が大好きです.
    チェックアウト私の他のGitの記事を説明し、次のいずれかの目を保つ.私は、定義、定義し、すべての土曜日のGitの概念を説明する!