GITサブモジュール再訪


Gitのサブモジュールは、一般に依存関係を管理するための選択肢を提供することに専念している業界全体が存在することを一般的に否定している.
しかし、Gitの中の何かのように、それはしばしばmanページに良いことをして、あなたが望むものをする若干のオプションがあるかどうか、あるいは、彼らが最近改善したかどうか見るために価値があることです.

欲しいもの
それでMetre 私の模範プロジェクトです.一部の顧客がLinuxの古代版を実行するので、一部のサブモジュールがあります.したがって、静的にリンクする必要があります.ああ、楽しい!
しかし、それは、例えばOpenSSLの我々自身のビルドを管理して、出荷することを意味します、そして、それは我々のセキュリティガイ(美しいシープと呼ばれる)の恐ろしい見通しです.それは実際に私もかなり恐ろしいです.
実用的な用語では、我々のリリースサイクルは、すべてのサブモジュール上で安定したブランチに沿って前進することを伴います.これは、できるだけ簡単にする必要があります-本当に、我々が必要として実行することができます単一のコマンド.
しかし、私たちは高い信頼性を持っているので、メトリックの特定のコミットハッシュをチェックすることで、私たちが構築したのと同じ依存関係を与えます.

git submodule addモジュール
最初に、私は行きましたgit submodule そして、多くのマニュアル作業.私はリードしなかった.サイモンセキュリティガイはこれで満足していなかった.ピート(我々のシニアDevのうちの1つ)は、プロジェクトの完全なチェックをして、それを強調しました.
問題は、1つのスリップと依存関係が重大なセキュリティ問題で残されることができたということです.そして、メトリックはすべてのセキュリティになるためのものです.
のプラス側git submodule これはサブモジュールのコミットハッシュを追跡しています.そして、git clone --recursive またはgit submodule update --init --recursive .
我々は何か他のものへの切り替えを考慮したが、我々は多くの組み込みのスマートを失うだろうgit submodule , そして、それも痛みです.

ああ、見てください-支店!
深く潜るman git-submodule and man 7 gitsubmodules , しかし、私は金を見つけました.
まず、ある-b branch 切り替えるgit submodule add . これは、特定のブランチにサブモジュールを追加し、さらに“追跡ブランチ”を設定します.通常、1つのgitが通常のようにリモート起源ブランチにプルします.
第二に、私はsubmodule.{submodule name}.branch , これを格納します.これはあなたが考えるのと同じくらい偉大ではありませんgit config 倉庫のために、それは追跡されません.

私のエディタSkillzを恐れてください
ただし、サブモジュールの設定は.gitmodules ファイルトップに.それで、あなたはそのファイルを編集することができて、セクションを見つけて、単にAを加えることができますbranch キー右側:
[submodule "deps/spiffing"]
        path = deps/spiffing
        url = http://github.com/surevine/spiffing
[submodule "deps/openssl"]
        path = deps/openssl
        url = git://git.openssl.org/openssl.git
        branch = OpenSSL_1_1_0-stable
デフォルトはmaster , しかし、もしそれがすべてあなたが欲しかったなら、あなたはすでにそれを持っている.

支店更新
サブモジュールを更新するための通常のコマンドはgit submodule update . 三つのフラグがあります.--init を実行するgit submodule init サブモジュールが既にクローンされていなくても、そうでなければ何もしないのであれば、常に安全です.--recursive 各サブモジュールを再帰して実行し、同じgit submodule update 各コマンド.--remote はマジックを実行するgit pull リモート追跡ブランチに沿って.それは、我々が欲しいこれです.

ワークフロー概要
したがって、ワークフローは次のようになります.git clone --recursive [email protected]:surevine/metre - リポジトリをクローンし、チェックアウトしますHEAD of master .git checkout foo - fooブランチかコミットをチェックし、サブモジュールをfooのコミットに切り替える.git submodule update --init --recursive --remote - すべてのサブモジュールを再帰的に更新します.Without the --remote , これは、サブモジュールの作業ディレクトリを“正しい”親のためのコミットをリセットします.
最後にgit config submodule.recurse true - ほとんどのコマンドが再帰的に動作しなければならないということをgitに伝えますgit pull .