Gitサブモジュールで作業しているときに問題があります。
アップストリームリポジトリから新しいサブモジュール参照を受け取るたびに、git submodule update
は次の結果を返します。
fatal: reference is not a tree: dd208d46ecdd1ac0d2b2594a610fe4c9150fece1
Unable to checkout 'dd208d46ecdd1ac0d2b2594a610fe4c9150fece1' in submodule path 'submodule/path'
サブモジュールには複数のリモートがあることに注意することが重要です。これらのリモートのうち、サブモジュール参照ツリーの更新にはアップストリームリモートを使用する必要があります。私の問題はそこにあると推測していますが、よくわかりません。
私のセットアップは次のとおりです。
Gitプロジェクト
リモコン:
Origin
(私のgit fork)upstream
(プロジェクトリポジトリ)サブモジュール「モジュール」、リモートがあります:
Origin
(私のgit fork)upstream
(プロジェクトリポジトリ)誰が私の問題の原因を知っていますか?
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つは、スーパーモジュールから新しいコミットを発行した人が、サブモジュールから必要なコミットを発行しなかったことです。最初にサブモジュールからコミットを公開する必要があります。
サブモジュールがプッシュされたことを確認してください
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つで変更をプッシュするのを忘れたときにこの問題を見た
変更がプッシュされていることを確認してください
私は同じ問題を抱えていて、親プロジェクトとすべてをプッシュするための新しいコミットの追加を解決しました
私の問題は、cat .gitmodules
私のレポの、サブモジュールのレポの間違ったリモートを指していました(元のリモートでクローンを作成していましたが、フォークに切り替えました; gitmodules
ファイルは更新されず変化する)。
私の問題は、build.gradleファイルのサブモジュールにコミットされていない変更があったことです(これは自動的に変更されたと思います)。彼らはgit diff
。今やりました git checkout .
サブモジュールリポジトリを変更せずにリセットし、git submodule update
働いた。
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
別の方法は、コマンドラインの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
注:サブモジュールの更新を試みる前に、リポジトリ内のローカルにチェックアウトされたサブモジュールフォルダーをさらに削除する必要がある場合があります。