158

これが私の.gitmodulesファイルの内容の一部です:

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git

ただし、.git/config最初のもののみが含まれます。

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git

2 番目のサブモジュール ( external/pyfacebook) は、機能ブランチの別の開発者によって追加されました。私は今開発を継承し、機能ブランチをチェックアウトしました。ただし、Git はサブモジュールをプルしません。私はもう試した:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • からすべてのサブモジュール定義を削除し.git/configて実行していgit submodule initます。既存のサブモジュールをコピーするだけで、新しいサブモジュールは無視されます。
  • .git/config手動で実行中の新しいサブモジュール定義を入力しますgit submodule update。既存のサブモジュールのみが更新されます。

さまざまな組み合わせがありますが、git は単に.git/configの新しい内容に基づいて更新したり、フォルダーを.gitmodules作成したり、サブモジュールの内容をプルしたりすることはありません。external/pyfacebook

私は何が欠けていますか?手作業による介入 (手動で にサブモジュール エントリを追加すること.git/config) は本当に必要ですか? また、その理由は何ですか?

編集:手動介入は機能しません。新しいサブモジュール エントリを手動で追加して.git/configも、何も起こりません。新しいサブモジュールは無視されます。

4

21 に答える 21

124

私はこれと同じ問題を抱えていました - .gitmodules ファイルはコミットされましたが、実際のサブモジュールのコミット (つまり、サブモジュールのコミット ID の記録) はコミットされていませんでした。

手動で追加すると、うまくいくように見えました-例:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(.git/config または .gitmodules から何も削除しなくても。)

次に、それをコミットして、ID を適切に記録します。

この実用的な回答にさらにコメントを追加します。git submodule init または git submodule update が機能しない場合は、上記のように git submodule add url でうまくいくはずです。これをクロスチェックするには

 git config --list

git config --list コマンドの結果でプルしたいサブモジュールのエントリを取得する必要があります。構成結果にサブモジュールのエントリがある場合は、通常の git submodule update --init でサブモジュールをプルする必要があります。この手順をテストするには、サブモジュールの名前を手動で変更してから、サブモジュールを更新します。

 mv yourmodulename yourmodulename-temp
 git submodule update --init

サブモジュールにローカルの変更があるかどうかを確認するには、 git status -u (サブモジュールの変更を確認したい場合) または git status --ignore-submodules (サブモジュールの変更を確認したくない場合) で確認できます。サブモジュール)。

于 2012-01-28T23:58:04.800 に答える
90

git バージョン 2.7.4。このコマンドはローカル コードを更新します git submodule update --init --force --remote

于 2016-11-21T11:15:49.617 に答える
20

gitが無視されinitupdateコマンドが実行され、何もしない場合、同じ問題が発生しました。

直し方

  1. サブモジュール フォルダーは git リポジトリにコミットする必要があります
  2. .gitignore にあってはいけません

その要件が満たされていれば、機能します。そうしないと、すべてのコマンドがメッセージと結果なしで実行されます。

あなたがそれをすべてやったが、それでもうまくいかない場合:

  1. サブモジュールを手動で追加します。git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. すべてのファイルをコミットしてプッシュします-.gitmodulesおよびモジュールフォルダー(フォルダーの内容はコミットされないことに注意してください)
  5. ローカルの git リポジトリをドロップします
  6. 新しいものを複製する
  7. .git/configまだサブモジュールがないことを確認してください
  8. さて、git submodule init-そして、モジュールが登録されたというメッセージが表示されます
  9. git submodule update- モジュールを取得します
  10. 今見ると.git/config、登録されたサブモジュールが見つかります
于 2015-10-27T13:45:01.807 に答える
10

私は同じ問題を抱えていましたが、上記の解決策はどれも役に立ちませんでした。.gitmodules と .git/config のエントリは正しかったのですが、コマンドgit submodules update --init --recursiveは何もしていませんでした。また、サブモジュール ディレクトリを削除し、実行git submodules update --init --recursiveしてサブモジュール ディレクトリを取得しましたが、コミットは以前とまったく同じでした。

このページで答えを見つけました。コマンドは次のとおりです。git submodule update --remote

于 2019-06-21T13:44:20.297 に答える
9

ここでも(また)回答に多くの混乱があるようです。

git submodule init(.gitmodules から) .git/config に何かを魔法のように生成することを意図したものではありません。親プロジェクトのクローンを作成した後、または以前に存在しなかったサブモジュールを追加するコミットをプルした後、完全に空のサブディレクトリに何かをセットアップすることを目的としています。

つまり、git cloneサブモジュール (クローンが .gitmodules ファイルをチェックアウトしたという事実によってわかる) を持つプロジェクトの をgit submodule update --init --recursive.

(または)を続けないでください。これは動作するはずがありません。実際、問題がなければ、追加によって適切な .git/config が既に更新されています。git submodule add ...git submodule initgit submodule update --init

編集

以前は存在しなかった git サブモジュールが他の誰かによって追加されgit pull、そのコミットを実行すると、そのサブモジュールのディレクトリは完全に空になります (実行するgit submodule statusと、新しいサブモジュールのハッシュが表示されるはずですが-、前にit.) この場合、以前は存在しなかった新しいサブモジュールをチェックアウトするために、(サブモジュール内のサブモジュールである場合はプラスしgit pullて) を追加する必要があります。サブモジュールを含むプロジェクトの最初のクローンの後と同じように(以前は明らかにそれらのサブモジュールがありませんでした)。git submodule update --init--recursive

于 2016-12-27T17:52:31.203 に答える
5

一種の魔法のようですが、今日、私は次から次へと実行し、サブモジュールをプルし始めgit submodule initまし git submodule syncgit submodule update... 魔法?多分!これは本当に Git で最も厄介な経験の 1 つです…</p>

それをスクラッチします。実際に実行して動作させましたgit submodule update --init --recursive。お役に立てれば。

PS: サブモジュールではなく、ルート git ディレクトリにいることを確認してください。

于 2014-05-19T01:10:13.813 に答える
4

Dave James Miller からの回答によると、それがうまくいったことを確認できます。ここで重要なことは、サブプロジェクトのコミット ID をコミットすることでした。.gitmodules にエントリを入れるだけでは十分ではありませんでした。

適切なコミットは次のとおりです。

https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae

于 2012-07-15T15:03:56.790 に答える
3

私も同じ問題を抱えていました。

.gitmodulesサブモジュールがありましたが、git submodule initコマンドの後、それはありませんでした.git/config

サブモジュールを追加した開発者は、ファイルにサブモジュールディレクトリも追加したことがわかり.gitignoreます。それはうまくいきません。

于 2013-01-28T03:44:56.570 に答える
2

以下の同期コマンドで問題が解決しました:

git submodule sync
于 2020-03-03T10:34:09.557 に答える
1

あなたと同じように、gitサブモジュールの同期は期待どおりに機能しないことがわかりました。明示git submodule addを再度実行した後でのみ、サブモジュールのURLが変更されます。

だから、私はこのスクリプトを入れました~/bin/git-submodule-sync.rb

https://gist.github.com/frimik/5125436

また、いくつかの受信後のgitdeployスクリプトでも同じロジックを使用しています。

私が今やらなければならないのは、編集してから.gitmodulesこのスクリプトを実行することだけです。そうすれば、最終的には思っgit submodule syncたとおりに機能します。

于 2013-03-09T19:36:53.630 に答える
1

私にとってうまくいったことを共有するだけです:

git clone --recurse-submodules <repository path>

これにより、すでにサブモジュールを含むリモート リポジトリが複製されます。これは、クローン作成後に git submodule update または init を実行する必要がないことを意味します。

于 2020-01-20T19:26:21.073 に答える
-1

サブモジュールのディレクトリを確認してください。

その中に .git ファイルしかない場合は、それを削除します。

今すぐ実行git submodule update --remote --init

于 2020-09-15T10:30:08.177 に答える