2376

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

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

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

4

18 に答える 18

3385

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

Gitのバージョン1.9からバージョン2.12まで(-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
于 2010-12-14T10:43:12.717 に答える
583

サブモジュールがいっぱいになる前に、2つのことを行う必要があります。

git submodule init 
git submodule update
于 2010-09-26T07:19:04.227 に答える
313

Git 2.23(2019年第3四半期):サブモジュールのクローンを作成て最新のリビジョンに更新する場合:

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

記録されたSHA1でそれらを複製したいだけの場合:

git clone --recurse-submodules

下記参照。

Git 2.29(2020年第4四半期)は、サブモジュールの処理に関して大幅な最適化をもたらすことに注意してください。

Orgad Shaneh()によるcommit a462bee(2020年9月6日)を参照してください。( Junio C Hamanoによってマージされました---コミット2ce9d4e、2020年9月18日orgads
gitster

submodule:オブジェクトIDのファイル名と参照のあいまいさのチェックを抑制します

サインオフ:Orgad Shaneh

のargv引数にcollect_changed_submodules()は、オブジェクトID(すべての参照のオブジェクト参照)のみが含まれます。

setup_revisions()入力がファイル名ではないことを渡すことで通知します。これによりassume_dashdash,、各参照の冗長な統計を回避できます。

refname_ambiguityまた、各オブジェクトのファイルシステムルックアップを回避するためにフラグを抑制します。同様のロジックは、cat-file、pack-objectsなどにあります。

この変更により、私のリポジトリ内のmanの時間が25秒から6秒に短縮されます。git fetch


元の回答2010

joschiがコメントで言及しているように、オプション(Git1.6.5以降)をgit submoduleサポートするようになりました。--recursive

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

init部分については、gitサブモジュールの再帰的な操作を参照してください。
詳細については、git submodule説明を参照してください。

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

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

git 2.8を使用した2016年の更新:「?を使用してgitサブモジュールのダウンロードを高速化/並列化する方法」を参照しください。git clone --recursive

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

git fetch --recurse-submodules -j2

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

Ben Avison()によるcommit 4c69101(2019年5月19日)を参照してください。( Junio C Hamanoによってマージされました---コミット9476094、2019年6月17日bavison
gitster

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

以前は、スーパープロジェクトに記録されたSHA-1ではなく、リモートトラッキングブランチでサブモジュールをチェックアウトするユースケースで、暗黙のコマンドにスイッチgit clone --recurse-submodulesを渡す方法がありませんでした。--remotegit submodule update

このパッチはこの状況を修正します。サブモジュールが複製されたばかりであるという理由で、
実際には同様に渡さ--no-fetchれます。そのため、リモートから再度フェッチすると、処理速度が低下するだけです。git submodule update

つまり、次のことを意味します。

--[no-]remote-submodules:

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

于 2010-09-26T08:17:08.913 に答える
157

[素早い回答]

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

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

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

git submodule init
git submodule update
于 2017-10-16T15:47:26.617 に答える
72

[素早い回答]

親リポジトリ(一部のサブモジュールリポジトリを含む)のクローンを作成した後、次の手順を実行します。

git submodule update --init --recursive
于 2019-07-01T09:39:55.503 に答える
38

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

git clone -b <branch_name> --recursive <remote> <directory>
于 2012-03-07T22:28:58.290 に答える
33

このコマンドを使用して、すべてのサブモジュールでリポジトリのクローンを作成します

git clone --recurse-submodules git@gitlab.staging-host.com:yourproject

すべてのサブモジュールのコードを更新するには

git submodule update --recursive --remote
于 2021-03-18T12:44:09.093 に答える
32

これを試して:

git clone --recurse-submodules

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

于 2013-01-16T18:39:31.563 に答える
29

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

git clone
git submodule init
git submodule update
于 2019-01-16T14:11:07.983 に答える
23

遅い答え

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

友人と1時間ほどいじっていたので、BitBucketの管理者権限を持っている場合でも、常に元のリポジトリのクローンを作成し、リポジトリを所有している人のパスワードを使用してください。あなたがこの地雷に遭遇したことを知るのは面倒です:P

于 2013-02-16T16:10:25.333 に答える
22

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

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

クローン作成後、サブモジュールブランチが変更されることがあるため、その後に次のコマンドを実行します。

git submodule foreach "git checkout master"
于 2019-01-17T04:44:37.940 に答える
21

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

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

また

git clone --recurse-submodules
于 2018-02-05T04:54:53.597 に答える
16

プロジェクトディレクトリでこれらを実行するだけです。

$ git submodule init
$ git submodule update
于 2021-03-08T04:54:29.407 に答える
13

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

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

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

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

于 2016-04-06T12:07:15.040 に答える
11

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

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

次に、サブモジュールを使用してリポジトリのクローンを作成できます(git clone --recursive YOUR-GIT-REPO-URL

また

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

于 2019-08-26T20:51:34.357 に答える
10

それが新しいプロジェクトである場合、あなたは単にこのようにすることができます:

$ 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
于 2019-08-26T08:46:46.037 に答える
7

これを試して。

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

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

于 2018-06-18T08:29:44.407 に答える
-5
git submodule foreach git pull origin master
于 2021-06-21T05:58:47.447 に答える