開発を容易にするために、gitサブモジュールを使用して10以上のリポジトリを1つの構造に集約しようとしています。
モジュールのクローンを作成し、ブランチをチェックアウトすることになっています。代わりに、モジュールはデタッチドヘッドモードでチェックアウトされます。
git clone [email protected]:org/global-repository.git
git submodule update —init
cd config-framework
git status
$git status
#HEAD detached at b932ab5
nothing to commit, working directory clean
gitmodulesファイルは大丈夫のようです
$cat .gitmodules
[submodule "config-framework"]
path = config-framework
url = [email protected]:org/config-framework.git
branch = MY_BRANCH
分離されたヘッドではなく、デフォルトでMY_BRANCHブランチをチェックアウトする必要があります。どうすればそれを達成できますか?
サブモジュールは常にチェックアウトされます切り離されたHEADモード。
これは、サブモジュールが親リポジトリのインデックスの特別なエントリに格納されているSHA1をチェックアウトするためです。
さらに、サブモジュールを.gitmodules
に登録したブランチに従わせる場合は、次のものが必要です。
git submodule update --init --remote
--remote
はgit fetch
に加えて、新しいHEAD
のチェックアウトを行います。
残念ながら、そのチェックアウトはブランチではなくコミットであるため(サブモジュールにはデフォルトでローカルブランチがないため)、...デタッチされたHEAD
モードに戻ります。
詳細については、「 Gitサブモジュール:ブランチ/タグを指定してください "」を参照してください。
あなたは試すことができます(テストされていません):
git submodule foreach 'git checkout -b $(git config -f /path/to/parent/repo/.gitmodules --get submodule.$path.branch)'
git submodule foreach
がスーパープロジェクトに関連するサブモジュールディレクトリの名前である '$path
'にアクセスできるという事実を利用します。
サブモジュールのブランチを指定して自動的にチェックアウトする試みがありました( commit 23d25e4 for Git 2.0)....しかし、逆になりました( commit d851ffb 、 2014年4月2日)!
まもなく登場するかもしれませんが、現在の実装ではそうではありません。
これを行うために、私は常に次のコマンドを使用します(以前のVonCの提案に少し基づいています:
export top=$(pwd)
git submodule foreach --recursive 'b=$(git config -f ${top}/.gitmodules submodule.${path}.branch); case "${b}" in "") git checkout ${sha1};; *) git checkout ${b}; git pull Origin ${b};; esac'
すべてのサブモジュールを(再帰的に)「正しい」ブランチ(設定されている場合)でチェックアウトし、それ以外の場合は最後にコミットされたヘッドでチェックアウトします。
サブモジュールに貢献することを計画している場合、最善のアプローチは、通常のgitリポジトリとして個別にチェックアウトすることです。リモコンの異なる支店で働いていますか?次に、テストに使用する単一のリモートにサブモジュールを向けます。