Version Control with Git ch17 Submodule Best Practices

Git勉強メモ

出典: 


Submodule Commands

  • いろいろある

Why Submodules?

  • モジュール化のため

Submodules Preparation

  • submodule切り出し対象は大抵すでにディレクトリになっている
  • submoduleを切り出す流れ

    1. 下位ディレクトリを上位ディレクトリと対等な場所に出す

      • 歴史を保持したければgit filter-branchを使う
    2. 切り出したディレクトリを適切な名前にリネーム
    3. サブモジュール用の上流リポジトリを用意する

      • GitHubとか
    4. サブモジュールをpushする
    5. 上位プロジェクトにサブモジュールを追加する
    6. 上位プロジェクトに.gitmodulesファイルを含めてコミット・pushする

Why Read Only?

  • 開発活動の分離を強制してくれる

    1. サブモジュールで独立して開発・テスト・ビルドを行う
    2. 上位プロジェクトからチェックアウトする
  • 回りくどいけれど暗黙的に最新コミットを指してしまうよりもよい

Why Not Read Only?

  • 上位プロジェクト内のサブモジュールを直接いじることもできる
  • 手っ取り早い
  • ただしリスキー

    • サブモジュールのpushを忘れると他の開発者が困る

Examining the Hashes of Submodule Commits

  • treeが、treeやblobのようにcommitを指す感じ

Credential Reuse

  • --recurse-submodulesをつけてcloneすると、サブモジュールにも再帰的に認証情報が適用される

Use Cases

  • 書籍のコードサンプルをopen sourceに

    • 上位プロジェクトはclosed
    • サンプル別にサブモジュールを切りopen sourceにする
  • プラグイン

    • 手作業コピペと異なり、歴史の紐付けができる
  • 巨大リポジトリ

    • gitが想定しているのはせいぜい1-4GBくらい

      • cf. SVNリポジトリは数百GBになったりする
  • 可視性制御

    • 開発者にサブモジュールをcloneさせない
    • CIサーバーのSSH鍵でだけサブモジュールをcloneできるようにする
    • 顧客に届くビルド成果物は必ずCIサーバでしかビルドできなくする

Multilevel Nesting of Repos

  • --recurse-submodulesオプション

    • git clone,fetch,pullが対応
  • --recurseオプション

    • submodule status, update, for each

Submodules on the Horizen

  • GUIのサポートなどが拡充してきている

英語

  • fault lines

    • 断層
  • lament

    • 嘆き悲しむ