大きなgitライブラリを複数の独立gitライブラリに分割
2157 ワード
常に1つのプロジェクトをする時、機能の増加に従って、プロジェクトのソースコードはますます膨大になって、ある日、ついに耐えられなくて、コードを複数の独立したモジュールに分割することを決定します.
この場合、gitでソースコードを管理すると、gitのfilter-branchツールを使用すると、サブディレクトリを独立したライブラリに迅速に分離でき、変更履歴も保持できます.
もちろんsvnや他のコードウェアハウスを使っている場合も、がっかりしないでgitライブラリに変換してから処理することができます.
gitのfilter-branchにはindex-filterがあり、任意のポリシーでソースコードディレクトリツリー構造とファイル内容全体を再定義できます.gitマニュアルの例は、提出されたすべてのファイルを削除することです.index-filterの牛刀小試としか言えません.ここで完成するタスクは、index-filterの強さを基本的に体現することができます.
たとえば、次のようなディレクトリ構造があります.
/
- include
- module-A
- module-B - src
- module-A
- module-B
ルートディレクトリの下にはinclude、src、makeの3つのサブディレクトリがあり、それぞれヘッダファイル、実装ファイルを格納するために使用されます.これは比較的典型的なディレクトリ構造であり、各サブディレクトリの下にはモジュール別に多くのサブディレクトリが区分されています.モジュールを独立させ、以下のディレクトリ構造を形成することを目標としている(モジュールA,Bはいずれもこのような構造である):
/
- include
- src
忘れないでください.このプロジェクトにはbranch-1、branch-2などいくつかの分岐点があります.複雑に見えるので、よく計画しなければなりません.
まず、module-A/branch-1、module-A/branch-2、module-B/branch-1 module-B/branch-2などの各モジュール、各ブランチに従って対応するブランチを確立し、確立されたブランチは、最初のブランチと同じコミット(commit)上に位置する.
次にindex-filterでディレクトリ構造を変更します.
module-A/branch-1を例にとると、include/module-Aをincludeディレクトリに移動し、src/module-Aをsrcディレクトリに移動する必要があるので、index-filterの足どりは次のように書くべきです.
filter.sh:
元のgitライブラリの変更は通常1つのモジュールにのみ適用されるため、index-filter処理後、新しいブランチには空のコミットが多く、コードが変更されていない.この場合、commit-filterで空のコミットを削除できます.コマンドは次のとおりです.
このように、module-Aに対応して、module-A/branch-1、module-A/branch-2があります.この2つのブランチを独立したライブラリに分離する必要があります.
この場合、gitでソースコードを管理すると、gitのfilter-branchツールを使用すると、サブディレクトリを独立したライブラリに迅速に分離でき、変更履歴も保持できます.
もちろんsvnや他のコードウェアハウスを使っている場合も、がっかりしないでgitライブラリに変換してから処理することができます.
gitのfilter-branchにはindex-filterがあり、任意のポリシーでソースコードディレクトリツリー構造とファイル内容全体を再定義できます.gitマニュアルの例は、提出されたすべてのファイルを削除することです.index-filterの牛刀小試としか言えません.ここで完成するタスクは、index-filterの強さを基本的に体現することができます.
たとえば、次のようなディレクトリ構造があります.
/
- include
- module-A
- module-B - src
- module-A
- module-B
ルートディレクトリの下にはinclude、src、makeの3つのサブディレクトリがあり、それぞれヘッダファイル、実装ファイルを格納するために使用されます.これは比較的典型的なディレクトリ構造であり、各サブディレクトリの下にはモジュール別に多くのサブディレクトリが区分されています.モジュールを独立させ、以下のディレクトリ構造を形成することを目標としている(モジュールA,Bはいずれもこのような構造である):
/
- include
- src
忘れないでください.このプロジェクトにはbranch-1、branch-2などいくつかの分岐点があります.複雑に見えるので、よく計画しなければなりません.
まず、module-A/branch-1、module-A/branch-2、module-B/branch-1 module-B/branch-2などの各モジュール、各ブランチに従って対応するブランチを確立し、確立されたブランチは、最初のブランチと同じコミット(commit)上に位置する.
次にindex-filterでディレクトリ構造を変更します.
module-A/branch-1を例にとると、include/module-Aをincludeディレクトリに移動し、src/module-Aをsrcディレクトリに移動する必要があるので、index-filterの足どりは次のように書くべきです.
filter.sh:
#!/bin/bash
git read-tree --empty
git read-tree --prefix=/include ${GIT_COMMIT}:include/module-A
git read-tree --prefix=/src ${GIT_COMMIT}:src/module-A
index-filterを呼び出すコマンド動作:git filter-branch -f --index-filter filter.sh module-A/branch-1
filter.shは実行可能な権限が必要です.元のgitライブラリの変更は通常1つのモジュールにのみ適用されるため、index-filter処理後、新しいブランチには空のコミットが多く、コードが変更されていない.この場合、commit-filterで空のコミットを削除できます.コマンドは次のとおりです.
git filter-branch -f --commit-filter 'git_commit_non_empty_tree "$@"' module-A/branch-1
はい、1つのブランチが処理され、残りの3つのブランチが同様に処理されます.このように、module-Aに対応して、module-A/branch-1、module-A/branch-2があります.この2つのブランチを独立したライブラリに分離する必要があります.
git init --bare ../module-A.git
git push ../module-A.git refs/heads/module-A/*:refs/heads/*
最後にmodule-A.gitからクローンされました.module-Aの独立したコードです.git clone module-A.git