37

git サブモジュールを操作するときに問題があります。

上流のリポジトリから新しいサブモジュール参照を受け取るたびに、実行するgit submodule updateと次の結果が得られます。

fatal: reference is not a tree: dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
Unable to checkout 'dd208d46ecdd1ac0d2b2594a610fe4c9150fece1' in submodule path 'submodule/path'

サブモジュールにはいくつかのリモートがあり、そのうちの上流のリモートを使用してサブモジュール参照ツリーを更新する必要があることに注意することが重要です。私の問題があると思いますが、よくわかりません。

私のセットアップは次のとおりです。

Git プロジェクト

リモコン:

  1. origin(私のgitフォーク)
  2. upstream(プロジェクトレポ)

サブモジュール「モジュール」にはリモートがあります:

  1. origin(私のgitフォーク)
  2. upstream(プロジェクトレポ)

私の問題の原因を誰か知っていますか?

4

8 に答える 8

39

を実行するgit submodule updateと、git はスーパー プロジェクトに保存されているコミット/ツリーをチェックアウトしようとします (この例では、コミット ID を持つものdd208d4...) 。

サブモジュール内にそのようなオブジェクトが存在しないため、エラーが発生すると思います。そこにあることを確認する必要があります。通常、これは、最初にリモートからフェッチ/プルする必要があることを意味します。

おそらくあなたはしなければならない

git submodule foreach git fetch
git submodule update

または多分

git fetch --recurse-submodules

サブモジュールが構成されていると仮定すると、リモートから不足しているコミットをフェッチできるようになりますorigin。最後に、欠落しているコミットをどこからフェッチできるかを知る必要があり、それを取得する必要があります

dd208d4...次のようなことを行うことで、持っているかどうかを確認できます。

cd ./module
git log dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
git cat-file -p dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
git ls-tree dd208d46ecdd1ac0d2b2594a610fe4c9150fece1

このような問題の考えられる原因の 1 つは、スーパー モジュールから新しいコミットを発行した人が、サブモジュールから必要なコミットを発行しなかったことです。彼は最初にサブモジュールからコミットを公開する必要があります。

于 2013-02-08T16:19:12.210 に答える
1

同じ問題があり、親プロジェクトに新しいコミットを追加してすべてをプッシュすることを解決しましたサブプロジェクトのコミットを確認し、モジュールからコミットします

于 2014-08-29T13:26:35.943 に答える
0

私の問題は、cat .gitmodules私のレポで、サブモジュールのレポの間違ったリモートを指していたことです(最初は元のリモートでクローンを作成していましたが、その後、そのフォークに切り替えました;gitmodulesファイルは更新されず、変更を反映しませんでした) .

于 2016-09-27T16:38:18.013 に答える