web-dev-qa-db-ja.com

リモートブランチを追跡するためのGitサブモジュール

開発を容易にするために、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ブランチをチェックアウトする必要があります。どうすればそれを達成できますか?

16
Nambi

サブモジュールは常にチェックアウトされます切り離されたHEADモード

これは、サブモジュールが親リポジトリのインデックスの特別なエントリに格納されているSHA1をチェックアウトするためです。

さらに、サブモジュールを.gitmodulesに登録したブランチに従わせる場合は、次のものが必要です。

git submodule update --init --remote

--remotegit 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日)!
まもなく登場するかもしれませんが、現在の実装ではそうではありません。

20
VonC

これを行うために、私は常に次のコマンドを使用します(以前の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'

すべてのサブモジュールを(再帰的に)「正しい」ブランチ(設定されている場合)でチェックアウトし、それ以外の場合は最後にコミットされたヘッドでチェックアウトします。

1
BartBog

サブモジュールに貢献することを計画している場合、最善のアプローチは、通常のgitリポジトリとして個別にチェックアウトすることです。リモコンの異なる支店で働いていますか?次に、テストに使用する単一のリモートにサブモジュールを向けます。

1
darKoram