web-dev-qa-db-ja.com

git clone --recursive and checkout master on all submodules in single line?

私はこのコマンドがサブモジュールでレポをフェッチするのが本当に好きです:

git clone [email protected]:my_user/my_repo.git --recursive

ただし、サブモジュールはすべて、到着時に「ブランチなし」に設定されているため、マスターごとに手動でチェックアウトする必要があります。サブモジュールを再帰的にプルし、ブランチを自動的にマスターに設定する方法はありますか?

48
tedsuo

サブモジュールを含むリポジトリのクローンを作成した後、次のコマンドはこれらすべてのマスターブランチを一度にチェックアウトします:

git submodule foreach --recursive git checkout master
65
qbein

どうですか:

git submodule update --init --recursive

すべてのサブモジュールおよびサブモジュール内のサブモジュールを初期化します。ただし、これがマスターをチェックアウトするかどうかはわかりません。

55
Mauvis Ledford

質問はwhyチェックアウトマスターです。サブモジュールは特定のshaに固定されています-これも、サブモジュールのクローンがその特定のコミットに修正される理由です。特定のshaを指定しないことにより、外部リポジトリはビルドを簡単に壊す可能性があります。間違いなくあなたが望むものではありません。意識的に更新します。ビルドは再現可能で、可能な限り修正される必要があります。

24
tcurdt

おそらく、開発ワークフローによってはgit-submoduleの代替としてgitslaveを検討する必要があります。具体的には、gitslaveはスーパープロジェクトのすべてのメンバーを同じブランチに保持します(特定のgit(gitslaveではない)コマンドがないと、別のブランチにいる場合でも多くのコマンドが警告します)。

Gitslave は、スーパープロジェクトとほとんど同じ時間でサブプロジェクトを制御および開発し、さらに通常はすべてのリポジトリに同じタグ、ブランチ、プッシュ、プルなどを行いたい場合に役立ちます時間。

git-submoduleは、サブプロジェクトを制御しない場合、またはサブプロジェクトが変更された場合でも特定のリビジョンでサブプロジェクトを修正したい場合に適しています。

6
Seth Robertson

すでに答えたように

git submodule foreach --recursive git checkout master

ブランチmasterのジョブを実行します。

しかし、それが使用できるすべてのサブモジュールに存在しないブランチの場合

git submodule foreach --recursive "git checkout branchname || true"

そうしないと、指定されたブランチがない最初のリポジトリでコマンドが失敗します。

3
YesThatIsMyName