web-dev-qa-db-ja.com

gitサブモジュールパスをチェックアウトできません

Gitサブモジュールで作業しているときに問題があります。

アップストリームリポジトリから新しいサブモジュール参照を受け取るたびに、git submodule updateは次の結果を返します。

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

サブモジュールには複数のリモートがあることに注意することが重要です。これらのリモートのうち、サブモジュール参照ツリーの更新にはアップストリームリモートを使用する必要があります。私の問題はそこにあると推測していますが、よくわかりません。

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

Gitプロジェクト

リモコン:

  1. Origin(私のgit fork)
  2. upstream(プロジェクトリポジトリ)

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

  1. Origin(私のgit fork)
  2. upstream(プロジェクトリポジトリ)

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

34
Richard Tuin

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

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

おそらくあなたは

git submodule foreach git fetch
git submodule update

または多分

git fetch --recurse-submodules

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

次のようなことで、dd208d4...があるかどうかを確認できます。

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

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

37
thaller

サブモジュールがプッシュされたことを確認してください

cd submodule-dir
git Push

私の場合、私は持っていた:

  • サブモジュールにコミット
  • 押されていない
  • 更新されたサブモジュールで親にコミットしました
  • 親を押した

見つからなかったのも不思議ではありません。

次に、GitHubなどのWebインターフェイスを使用している場合は、サブモジュールリポジトリのWebページに移動して、必要なコミットが表示されることを再確認することもできます。

Push.recurseSubmodules on-demand

次の方法でプッシュをさらに自動化できます。

git Push --recurse-submodules=on-demand

また、必要に応じてサブモジュールをプッシュするか、2.7から開始します。

git config Push.recurseSubmodules on-demand
git Push

サブモジュールの1つで変更をプッシュするのを忘れたときにこの問題を見た

変更がプッシュされていることを確認してください

1
Trident D'Gao

私は同じ問題を抱えていて、親プロジェクトとすべてをプッシュするための新しいコミットの追加を解決しましたCheck the Subproject commit and commit from your module

1
protonss

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

0
Ben Kreeger

私の問題は、build.gradleファイルのサブモジュールにコミットされていない変更があったことです(これは自動的に変更されたと思います)。彼らはgit diff。今やりました git checkout .サブモジュールリポジトリを変更せずにリセットし、git submodule update働いた。

0
Rock Lee

git rm --cached <submodule-directory>を追加すると、gitlabで役立ちます:

.prepare_deploy: &prepare_deploy
  before_script:
    - bundle install -j $(nproc) --path vendor
    - which ssh-agent || (apt-get update -y && apt-get install openssh-client -y)
    - mkdir -p ~/.ssh
    - chmod 700 ~/.ssh
    - eval $(ssh-agent -s)
    - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
    - (echo "$SSH_PRIVATE_KEY" | base64 --decode) > ~/.ssh/id_rsa
    - chmod 600 ~/.ssh/id_rsa
    - git rm --cached <submodule-directory>
    - git submodule sync --recursive
    - git submodule update --init --recursive
0
c80609a

別の方法は、コマンドラインのgitオプションなしで、手動でこれを行うことです。このシナリオは、サブモジュールのパスが移動/置換された(ただし正しくない)場合にほとんど発生します。これにより、ローカルチェックアウトリポジトリの古い参照が引き続き参照されます。

1)リポジトリとサブモジュールを見つけます

ls -la .git/modules
   rm -f .git/modules/<module-with-issue>

2)古いローカルサブモジュール構成を削除する

 gedit .git/config

(ここでサブモジュールのURLエントリを削除します)

次のようになります。

 *[submodule "module-with-issue"]
       url = ...*

3)さて、サブモジュールをフェッチして更新しますgit fetch git submodule update --recursive --init

注:サブモジュールの更新を試みる前に、リポジトリ内のローカルにチェックアウトされたサブモジュールフォルダーをさらに削除する必要がある場合があります。

0
parasrish