サブモジュールを含む「git clone」する方法は?


1994

サブモジュールをレポに入れようとしています。問題は、親リポジトリを複製すると、サブモジュールフォルダーが完全に空になることです。

git clone parent_repo実際にデータをサブモジュールフォルダーに配置する方法はありますか?

例えば、http://github.com/cwolves/sequelize/tree/master/lib/はnodejs-mysql-native外部のGitのサブモジュールを指しているが、私はチェックアウト時にsequelize、プロジェクトを、そのフォルダは空です。


4
そのコマンドはgit clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23)になります。1つのコマンドでサブモジュールを複製して更新します。以下の私の編集した回答を参照しください。
VonC

回答:


2976

Gitのバージョン2.13以降で--recurse-submodulesは、--recursive次の代わりに使用できます。

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

編集者注:-j8バージョン2.8で使用可能になったオプションのパフォーマンス最適化であり、一度に最大8つのサブモジュールを同時にフェッチします—を参照してくださいman git-clone

バージョン2.12までのバージョン1.9のGit(-jフラグはバージョン2.8+でのみ使用可能):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

Gitのバージョン1.6.5以降では、以下を使用できます。

git clone --recursive git://github.com/foo/bar.git
cd bar

すでに複製されたリポジトリ、または古いGitバージョンの場合は、次を使用します。

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive

123
知識の少ないクローンが初期化されたサブモジュールを自動的に取得できるように、gitリポジトリでこの動作をデフォルトとして指定する方法はありますか?
NHDaly 2013

11
@NHDaly残念ながら、違います。(少なくとも、私が知っていることではありません。)
Mathias Bynens 2013

6
そして、論理的にgit clone --recursiveを考えると、サブモジュールのサブモジュールも入力されますよね?
jayarjo 2013


5
@toszter:それはとても賢明ですか?何保持レポがあるサブモジュールのバージョン必要がある場合ではありませんの master
Gauthier

498

サブモジュールが入力される前に、2つのことを行う必要があります。

git submodule init 
git submodule update

8
そのことを恐れていました...その場合、部分的なプロジェクトをチェックアウトしているので、意味がありません。サブモジュールの更新が自動的ではないことを理解していますが、バインドされたバージョンが自動的にチェックアウトされないのはなぜですか?それを強制する方法はありますか?3レベルのサブモジュールを使用するプロジェクトがあり、チェックアウトを実行するためにそれだけトラバースする必要があるのはばかげているようです。
マーク

11
git-submodule(1)マニュアルページ(kernel.org/pub/software/scm/git/docs/git-submodule.html)をお読みください。git submodule updateと呼ばれる素晴らしいパラメータをサポートしていることがわかります--recursive
joschi

95
両方を1つのコマンドで実行しないのはなぜですか?git submodule update --init私の答えも参照しください)。
Mathias Bynens、2010

9
この2つのコマンドで質問に答えた方がいいと思います。そのタスクを達成する方法を説明しています。
schmijos 2013

6
@MathiasBynens私がログインしたばかりのマシンにはgit 1.5.5.6しかありません。これは明らかに短縮された命令をサポートしていませんが、2つのコマンドとしてサポートしています。
ジャックポールソン2013

223

Gitの2.23(Q3 2019):クローンを作成する場合、最新のリビジョンにサブモジュールを更新します。

git clone --recurse-submodules --remote-submodules

それらを記録されたSHA1でクローンしたい場合:

git clone --recurse-submodules

下記参照。


元の回答2010

以下のようjoschiはコメントで言及し、git submoduleサポートするようになりまし--recursiveオプション(Git1.6.5およびそれ以上)。

--recursiveが指定されている場合、このコマンドは登録されたサブモジュールに再帰し、ネストされたサブモジュールを更新します。

initパートについては、再帰的gitサブモジュールを操作するをご覧ください。
詳細git submoduleについては説明を参照てください。

git以降のバージョン1.6.5では、次の–-recursiveオプションを使用してスーパープロジェクトを複製することで、これを自動的に行うことができます。

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

2016年の更新、Git 2.8を使用:「Gitサブモジュールのダウンロードを高速化/並列化する方法を教えてgit clone --recursiveください

複数のスレッドを並行して使用して、サブモジュールのフェッチを開始できます。
インスタンスについて:

git fetch --recurse-submodules -j2

さらに良いことに、Git 2.23(2019年第3四半期)では、1つのコマンドでサブモジュールを複製し、トラッキングブランチにチェックアウトできます!

Ben Avison(によるコミット4c69101(2019年5月19日)を参照してください。(合併によりJunio C浜野- -9476094コミット、2019年6月17日)をbavison
gitster

clone--remote-submodulesフラグを追加

使用している場合git clone --recurse-submodulesがあることは以前に合格する方法ではなかった--remote暗黙的にスイッチをgit submodule update使用すると、サブモジュールが自分のリモート追跡ブランチ上ではなく、SHA-1親プロジェクトに記録してチェックアウトしたい任意のユースケースのためのコマンド。

このパッチはこの状況を修正します。
これは、実際に合格--no-fetchするgit submodule updateだけでなく、彼らはサブモジュールがばかりクローニングされている理由のよう、リモートもう一度だけからフェッチするようダウン遅いものになります。

つまり:

--[no-]remote-submodules:

複製されるすべてのサブモジュールは、スーパープロジェクトの記録されたSHA-1ではなく、サブモジュールのリモート追跡ブランチのステータスを使用してサブモジュールを更新します。に渡すの--remoteと同じgit submodule updateです。


3
したがって、Gitがサブモジュールの適切なサポートを追加し始めるまでに14年かかりましたね。更新していただきありがとうございます!サブモジュールがなく、SHA1が記録されていないメインリポジトリのクローンがすでにあり、各サブモジュールの最新バージョンを取得したい場合はどうすればよいですか。それは可能ですか?
バイオレットキリン

1
@VioletGiraffeその複製されたリポジトリにサブモジュールがある場合、「記録されたSHA1」があります。そして、git submodule update --init --recursive --remoteそれらをそれぞれのブランチの最新のコミットに更新する必要があります。(例:stackoverflow.com/a/56981834/6309
VonC

1
例を挙げて説明します。Githubにサブモジュールを使用するテンプレートプロジェクトがあり、このテンプレートリポジトリにサブモジュールの特定のリビジョンをコミットしました。しかし、このリポジトリから新しいプロジェクトを作成すると、リストしたコマンド(clone --recurse-submodules --remote-submodulesまたはsubmodule update --init --recursive --remote)のいずれも、実際にサブリポジトリをフェッチできませんでした。入手できるのは.gitmodulesファイルだけです。サブリポジトリを手動で1つずつ複製する以外に、サブリポジトリを初期化する方法を見つけることができませんでした。私は少なくともそれを行うためのスクリプトを作成したいと思いsubmodule foreachます...
Violet Giraffe

あなたが解決策を知っているなら、あなたが答えることができる別の質問をします。ここで私は手で以外を初期化する方法を見つけることができないことをテストレポです:github.com/VioletGiraffe/TEST
バイオレットキリン

@VioletGiraffeこれは、.gitmodulesを追加してコミットしたが、gitlinkはコミットしていないためです(stackoverflow.com/a/16581096/6309、インデックス内の特別なエントリ:stackoverflow.com/a/19354410/6309)これを行うリポジトリは次のとおりです適切なgitlinkが登録されている:github.com/tiagomazzutti/antlr4dart
VonC

109

[素早い回答]

このコマンドを使用して、すべてのサブモジュールでリポジトリを複製できます。

git clone --recursive YOUR-GIT-REPO-URL

または、すでにプロジェクトのクローンを作成している場合は、以下を使用できます。

git submodule init
git submodule update

33

サブモジュールがブランチに追加された場合は、クローンコマンドに必ず含めてください...

git clone -b <branch_name> --recursive <remote> <directory>

これは私が探していたものに似ていました...しかし、サブモジュールはブランチを「分離」としてリストします。:(
AceFunk

28

これを試して:

git clone --recurse-submodules

親プロジェクトにサブモジュールがすでに追加されている場合は、サブモジュールデータが自動的に読み込まれます。


37
--recurse-submodules--recursive同等のエイリアスであることに注意してください。
Joel Purra 2013年

その場合の@SuperUberDuperはgit submodule update --init --recursiveこの回答で
Enrico

25

私はあなたが3つのステップで行くことができると思います:

git clone
git submodule init
git submodule update

21

遅い答え

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

友人といじくり回すのに1時間費やしたので、BitBucketの管理者権限がある場合でも、常にORIGINALリポジトリのクローンを作成し、リポジトリを所有しているリポジトリのパスワードを使用してください。あなたがこのマイントラップに遭遇したことを知るのは面倒です:P


それがまさに私が扱っていることです。それで、サブモジュールを持つbitbucketリポジトリで開発する必要がある人は誰でも、リポジトリ作成者の資格情報を使用する必要があると言っていますか?ブレッヒ。
jsleuth 2013年

@jsleuthはそう思える-それは大きな時間を吸う...そして私はそれを知っています。
カイザー2013年

それはバグのように聞こえます。Bitbucketに報告しましたか?
Mathias Bynens 2014

@MathiasBynensこの問題に遭遇しましたか?それは1年半後のことであり、これがまだ事実であるかどうかは実際にはわかりません。
カイザー2014

4
これはOPの質問に明確に回答するものではありませんが、Bitbucketの無関係なバグについて詳しく説明しています。ちなみに、「SSHキー認証を使用する」に短縮することもできます。
トレフィノン2017

18

gitリポジトリにサブモジュールを含めるには、これを試してください。

git clone -b <branch_name> --recursive <remote> <directory>

または

git clone --recurse-submodules

18

--recursiveリポジトリのクローンを作成するときにフラグを使用できます。このパラメーターにより、gitはリポジトリー内のすべての定義済みサブモジュールのクローンを作成します。

git clone --recursive git@repo.org:your_repo.git

複製後、サブモジュールのブランチが変更される場合があるため、この後にこのコマンドを実行します。

git submodule foreach "git checkout master"


11

サブモジュールの並列フェッチは、複数のリポジトリーを一度にフェッチできるようにすることで、リポジトリーとそのすべての関連サブモジュールをフェッチするのに必要な時間を短縮することを目的としています。これは、新しい--jobsオプションを使用して実行できます。例:

git fetch --recurse-submodules --jobs=4

Gitチームによると、これにより、多くのサブモジュールを含むリポジトリの更新を大幅に高速化できます。新しい--jobsオプションなしで--recurse-submodulesを使用すると、Gitはサブモジュールを1つずつフェッチします。

出典:http : //www.infoq.com/news/2016/03/git28-released


8

GitHubリポジトリでも同じ問題が発生しました。アカウントにSSHキーがありませんでした。プロセスは

  1. SSHキーを生成
  2. GitHubアカウントに新しいSSHキーを追加する

次に、サブモジュールを使用してリポジトリを複製できます(git clone --recursive YOUR-GIT-REPO-URL

または

git submodule initおよびgit submodule updateを実行して、すでに複製されたリポジトリ内のサブモジュールをフェッチします。


はい、それはPermission denied (publickey). fatal: Could not read from remote repository.エラーです
Ender

5

これを試して。

git clone -b <branch_name> --recursive <remote> <directory>

ブランチにサブモジュールを追加した場合は、それをcloneコマンドに追加してください。


5

新しいプロジェクトの場合は、次のようにすることができます。

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

それがすでにインストールされている場合:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.