Gitは新しいサブモジュールを初期化/同期/更新しません


113

これが私の.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はの新しいコンテンツに基づいて更新されず.gitmodulesexternal/pyfacebookフォルダを作成してサブモジュールのコンテンツをプルしません。

何が欠けていますか?手動による介入(サブモジュールエントリを手動でに追加する.git/config)は本当に必要ですか、なぜですか?

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


1
1.7.7.1を実行していて、同じ問題があります。「git submodule sync」は、.gitmodulesへの変更後に.git / configを更新しません。
James Pritts、2011

回答:


35

最近gitバージョン1.7.0.4にアップグレードしましたか?私は同じような問題を抱えていました...

編集:私は自分の問題を修正しましたが、どこに問題があるのか​​まったくわかりません。.git / configと.gitmodulesの両方からサブモジュールのエントリを手動で削除し、通常の手順でサブモジュールを再度追加しました(git submodule add etc ...)... Worksformeが、このスレッドに値を追加しません。


今は1.7.2までですが、1.6.x以降から問題が発生していると思います。
デビッドアイク

そして、はい、考えてみると、私はあなたが説明するようにやらなければならなかった(この質問がまだ開かれていたのを忘れていた!)。あなたの答えを少し磨いても構わないなら、私はそれを受け入れます。
David Eyk、2010

9
これは現在進行中のgitの弱点です。svnでさえ外観的には優れています。
Peter DeWeese

3
私もこれに遭遇したと思います(同じ手順でようやく修正されたようです)。私が気付いた唯一のことは、それを再度追加してコミットした後、コミットが言ったことです:作成モード160000 lib / jruby-swing-helpers(
えっ

1
「作成モード160000」について、プロGitブックは次のように述べています。ファイル。" git-scm.com/book/en/Git-Tools-Submodules
Johann

92

私はこれと同じ問題を抱えていました-.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サブモジュールの更新--initでサブモジュールをプルする必要があります。この手順をテストするには、サブモジュールの名前を手動で変更してから、サブモジュールを更新します。

 mv yourmodulename yourmodulename-temp
 git submodule update --init

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


何のexternal/pyfacebookため?
IgorGanapolsky 2015

2
@IgorGanapolskyこれがサブモジュールの宛先パスです。
ユワ2015

これは私に役立ちました、本当にありがとう!:私はちょうど先のパスがすでに(それは他のコマンドをしようとした結果として私のためにしたもの)が存在する場合は、1つだけの混乱を追加し、次のメッセージを取得することを追加することができます'your/local/path' already exists and is not a valid git repo
マイケルAmbrus

1
「git config --list」のエントリを読み取るための1つのライナー:git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash
Puggan Se

64

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


20
私のために何もしない。
Carlo Wood

1
git-submodule [ドキュメント](git-scm.com/docs/git-submodule#git-submodule---remote)に関しては、前述のコマンドでサブモジュールのローカルブランチを更新する必要があります。
palik 2016

1
@palikあなたロック!
Denis Trofimov

1
を使用して、個々のモジュールを更新できますgit submodule update --init --force --remote <module-name>
Adam Faryna

15

gitが無視initしてupdateコマンドを実行しても同じ問題が発生し、何も実行されませんでした。

直し方

  1. サブモジュールフォルダーをgit repoにコミットする必要があります
  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、あなたは登録されたサブモジュールを見つけるでしょう

1
サブモジュールへのパスは.gitignoreにあると思います。少なくとも、@ DaveJamesMillerからの回答に従って、それを機能させました。他には何もうまくいきませんでした。
gebbissimo 2018

7

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

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

言い換えると、git cloneサブモジュールを持つプロジェクト(クローンが.gitmodulesファイルをチェックアウトしたことでわかる)をでフォローしますgit submodule update --init --recursive

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

編集

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


1
これは興味深いことgit help submoduleです。「init:インデックスに記録されたサブモジュール(他の場所に追加およびコミットされたもの)を、.gitmodulesから.git / configにコピーして、サブモジュール名とURLをコピーすることにより初期化します。」だから、それはあなたがそれがしないと言っていることを正確に行うべきであるように聞こえる ... ...?gitドキュメントの更新の時間ですか?
ブラッド

@brad言ったことはないと思いますが、その特定のケースについての説明を追加しました。ありがとう。
カルロウッド

@CarloWood gitサブモジュールの作成者--initが新しいサブモジュールを取得するためにそれを(自動的に取得するのではなく)必要があると判断した理由はupdate何ですか?リポジトリを更新すると、データを破壊しない限り、必要なものすべてを取得するように見えます。これにより--init、新しいサブモジュールが作成された可能性があること、または常に毎回発行される可能性が--initあることを確認する必要があります。この場合も、デフォルトで有効になっているはずです。
Catskul 2017年

@Catskul明らかに、gitサブモジュールの作成者がなぜ何かを決定したかはわかりませんが、私の推測では、「update」はすでに存在するものを更新するために予約されており、「init」は何かを(ローカルで)新しいものに作成するために使用されます。内部的には、この2つはかなり異なるため、別のコマンドを正当化できます。
カルロウッド

6

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

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


2
これも正しい解決策でした。のgit submodule update代わりに走っていたgit submodule update --remote
Andrew Medlin

5

一種の魔法のようですが、今日私はgit submodule init続いて実行され、 git submodule sync続いてgit submodule updateそれが私のサブモジュールを引き出し始めました... たぶん!これは本当にGitで最も煩わしい経験の1つです...

スクラッチ。実際にやってみましたgit submodule update --init --recursive。お役に立てれば。

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


7
いや、これは私には絶対に何もしません。
IgorGanapolsky 2015年

@IgorGanapolsky私は上記の答えを自分に合った方法で編集しました。うまくいくかどうか教えてください!
Levi Figueira 2015年

私はあなたの新しいコマンドを試しましたが、何もしませんでした。
IgorGanapolsky 2015

5

手動で設定することを考える.gitmodulesに十分であることであるWRONG

git version 2.22.0これを書いている時点での私の地元。

だから私はこのスレッドに来て、なぜうまくいかなかったのかと思いgit submodule initました。.gitmodulesファイルをセットアップして続行しましたgit submodule init...

重要

  1. git submodule add company/project.git includes/project(モジュールを初めて追加するとき)が必要な場合、これは次のようになります。

    • 設定を追加 .git/config
    • .gitmodulesファイルを更新する
    • includes/projectこの例では)サブモジュールの場所を追跡します。
  2. あなたがしなければならないそしてgit commitあなたがサブモジュールを追加した後で、これはコミットされます.gitmodulesと追跡サブモジュールの場所。

プロジェクトが再度複製されると、プロジェクトには.gitmodulesと空のサブモジュールディレクトリ(includes/projectこの例では)が含まれます。この時点で.git/configはまだgit submodule initが実行されるまでサブモジュール構成はありません。また、メインのgitリポジトリで.gitmodulesAND includes/projectが追跡されるため、これは機能するだけであることを覚えておいてください。

参照用としても参照してください:



3

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

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

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


2

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

だから、私はこのスクリプトを~/bin/git-submodule-sync.rb次の場所に置きます:

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

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

編集する必要があるのは.gitmodulesこのスクリプトを実行するだけで、最終的にgit submodule syncは想定どおりに機能します。


これは一部のリポジトリでのみ発生するようです...おそらくGitのバグが原因です。新しく作成されたリポジトリでは長い間発生していませんでしたが、昔、特定のリポジトリで常に発生していました...
fridh

2

私は今日同じ問題を抱えていて、git submodule initそれをタイプしたのでそれを自分の行に入れていたことがわかりました.git/config

[submodule]
   active = .

私はそれを削除して入力しました:

git submodule update --init --remote

そして、すべてが正常に戻りました。私のサブモジュールは、サブディレクトリでいつものように更新されました。


2

私にとっての問題は、リポジトリの以前の開発者がsubmodules/thingフォルダーを通常のフォルダーとしてコミットしていたことです。つまり、を実行しようとするgit submodule add ...と失敗しますが'submodules/thing' already exists in the index、サブモジュールを更新しようとしても、パスが失敗したためサブモジュールを含みます。

修正するには、submodules/thingフォルダーを削除し、削除をコミットしてgit submodule addから、コマンドを実行してフォルダーを正しく追加し直す必要がありました。

git submodule add --force --name thing https://github.com/person/thing.git submodules/thing

1

私は今日これを見たときに、開発者は新しいサブディレクトリにツリーの一部を移動していたし、彼のGitクライアントではなく、彼らはちょうど残し、被爆して、ツリーに更新サブプロジェクト規則を記録していなかったかのように見える.gitmodules古いの両方に言及します現在のツリーに存在しなくなった場所とサブプロジェクト。

サブモジュールを再び追加し、サブモジュールのコミットshaをgit show $breaking_commit_sha(regexpに一致する行を検索)にあるものと比較して、^-Subproject必要に応じて修正します。


1

サブモジュールdirとその内容( "external / pyfacebook"フォルダー)が以前に存在していた場合、それを削除git submodule add ...すると問題が解決する可能性があります。


1
これは私にとって問題でした。誰かが「サブモジュール」フォルダを通常のフォルダとしてコミットしました。つまり、「git submodule add ...」を実行しようとすると、「「vendor / mobx-state-tree」はすでにインデックスに存在します」というエラーが発生します。 、それでもサブモジュールを更新しようとすると、パスにサブモジュールが含まれていないことがわかったため、失敗します。修正するには、フォルダを削除し、削除をコミットしてから、git addコマンドを実行して、正しく追加し直す必要がありました。
Venryx

1

サブモジュールにも同様の問題がありました。それは単にクローン/プル/更新/何でもしたくありませんでした。

を使用してサブモジュールを再度追加しようとするとgit submodule add git@my-repo.git destination、次の出力が表示されました。

A git directory for 'destination' is found locally with remote(s):
  origin        git@my-repo.git
If you want to reuse this local git directory instead of cloning again from
  git@my-repo.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

だから、私はaddコマンド強制しようとしました
git submodule add --force git@my-repo.git destination

それは私の場合にはうまくいきました。


0

記録のために:
私はサブモジュールとして空のリポジトリを追加することで同じ問題を作成しました。この場合、サブモジュールで使用できる参照ハッシュがなかったため、元の投稿者によって記述されたエラーが発生しました。

コミットした後にリポジトリを強制的に追加すると、問題が解決しました(Arvidsの投稿のように)
git submodule add --force git@my-repo.git destination


0
  • からサブモジュールを削除します .git/config
  • git submodule initコマンドを実行
  • サブモジュールディレクトリに移動して実行します git pull origin master

今は動くはずです


0

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

git clone --recurse-submodules <repository path>

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.