web-dev-qa-db-ja.com

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

.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に手動で追加しても、何も起こりません。新しいサブモジュールは無視されます。

91
David Eyk

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

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

32
Quickredfox

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

それを手動で追加することは、トリックを行うように見えました-例えば:

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

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

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

この作業中の回答にさらにコメントを追加する:gitサブモジュールのinitまたはgitサブモジュールの更新が機能しない場合、上記のように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(変更を表示したくない場合)で確認できますサブモジュール)。

77

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

49
palik

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そして、登録されたサブモジュールが見つかります
15
Alex Ivasyuv

魔法のようですが、今日私はgit submodule init に続く git submodule sync に続く git submodule updateそして、それは私のサブモジュールを引き出し始めました...マジック?おそらく!これは、Gitで最も迷惑な経験の1つです。

スクラッチ。私は実際にgit submodule update --init --recursive。お役に立てれば。

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

5
Levi Figueira

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

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

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

あなたはするnotgit submodule add ...git submodule init(またはgit submodule update --init)を付けて、動作しない。実際、物事が機能する場合、追加はすでに適切な.git/configを更新します。

[〜#〜] edit [〜#〜]

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

4
Carlo Wood

同じ問題がありました。

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

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

3
joseph.hainline

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

そこで、このスクリプトを~/bin/git-submodule-sync.rbに入れました。

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

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

ここで必要なのは、.gitmodulesを編集してからこのスクリプトを実行するだけで、git submodule syncが想定されていたように動作します。

2
fridh

今日も同じ問題があり、git submodule initその後、私の行にそれらの行がありました.git/config

[submodule]
   active = .

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

git submodule update --init --remote

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

2
Eric Jeker

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

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

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

2
dirkaholic

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

これについての答えを見つけました ページ 。コマンドは:git submodule update --remote

2
masterop

今日私がこれを見たとき、開発者はツリーの一部を新しいサブディレクトリに移動しましたが、彼のgitクライアントは更新されたサブプロジェクトルールをツリーに記録せず、代わりに_Nのままで、.gitmodules古い場所と、現在のツリーに存在しなくなったサブプロジェクトの両方を参照します。

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

1
Phil P

サブモジュールでも同様の問題がありました。クローン/プル/アップデート/その他は何でもしたくありませんでした。

git submodule add [email protected] destinationを使用してサブモジュールを再追加しようとすると、次の出力が表示されました。

A git directory for 'destination' is found locally with remote(s):
  Origin        [email protected]
If you want to reuse this local git directory instead of cloning again from
  [email protected]
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 [email protected] destination

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

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

今すぐ動作するはずです

0

git submodule add ...の前にサブモジュールdirとそのコンテンツ( "external/pyfacebook"フォルダー)が存在する場合は削除すると問題が解決する場合があります。

0
atahan

記録のために:
サブモジュールとしてempty repositoryを追加して、同じ問題を作成しました。この場合、サブモジュールで使用可能な参照ハッシュがなかったため、元の投稿者が説明したエラーが発生しました。

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

0
Marc

手動で.gitmodulesを設定するだけで十分だと思うのは[〜#〜] wrong [〜#〜]

この執筆時点の私のローカルgit version 2.22.0

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

[〜#〜] important [〜#〜]

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

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

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

また、参照については、以下を参照してください。

0
farinspace