web-dev-qa-db-ja.com

Gitサブモジュールに新しいコミットが表示され、サブモジュールのステータスにコミットするものは何もない

Gitリポジトリで、githubリポジトリを参照するように.gitmodulesファイルを設定しました。

[submodule "src/repo"]
    path = src/repo
    url = repourl

このリポジトリで「git status」を実行すると、次のように表示されます。

On branch master
Your branch is up-to-date with 'Origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

modified:   src/repo (new commits)

Src/repoにcdし、repoでgitステータスにすると、コミットするものは何もないと表示されます。

トップレベルのgit repoが文句を言うのはなぜですか?

54

これは、Gitがどのコミット(ブランチやタグではなく、SHA-1ハッシュで表される1つのコミットのみ)をサブモジュールごとにチェックアウトする必要があるかを記録するためです。サブモジュールdirで何かを変更すると、Gitはそれを検出し、それらの変更をトップレベルのリポジトリにコミットするように促します。

トップレベルのリポジトリでgit diffを実行して、Gitが実際に何を変更したかを示します。サブモジュールですでにいくつかのコミットを行っている場合(したがってサブモジュールで「クリーン」)、サブモジュールのハッシュの変更が報告されます。

$ git diff
diff --git a/src/repo b/src/repo
index b0c86e2..a893d84 160000
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit a893d84d323cf411eadf19569d90779610b10280

それ以外の場合は、トップレベルのリポジトリでステージングまたはコミットできない-dirtyハッシュの変更が表示されます。 git statusはまた、サブモジュールに追跡されていない/変更されたコンテンツがあると主張しています。

$ git diff
diff --git a/src/repo b/src/repo
--- a/src/repo
+++ b/src/repo
@@ -1 +1 @@
-Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea
+Subproject commit b0c86e28675c9591df51eedc928f991ca42f5fea-dirty

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)

    modified:   src/repo (untracked content)

no changes added to commit (use "git add" and/or "git commit -a")

サブモジュールでチェックアウトする必要があるコミットレコードを更新するには、サブモジュールでの変更をコミットすることに加えて、サブモジュールをgit commitする必要があります。

git add src/repo
44
yaegashi

私はこの同じクラスの問題に遭遇し、受け入れられた回答のコメントセクションで@ AugustinAmenabarによって提供されるソリューションを使用することができました。私のセットアップはもう少し複雑だったので、--recursiveフラグを使用して、すべての依存関係を最新にします。

git submodule update src/repo --recursive

27
Zak

ここでの答えはどれも私の問題を解決しません。

私はここで私のために働いたものを文書化/共有しています。それが誰かを助けることを願っています。

最初、私のサブモジュールはコミットAにありました(メインモジュールにサブモジュールを追加したとき)、次にブランチをチェックアウトしました(それをnew-submodule-branch)そして、BとCにコミットし、リモートにプッシュしました(github.com)

これを投稿すると、私のメインのリポジトリが表示され始めました

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   <submodule_name> (new commits)

もしメインのレポルートから、私がgit submodule update --remote --init --recursive、それは私のサブモジュールのHEADをデタッチした状態に戻してAをコミットし続けた

だから私はブランチの値をnew-submodule-branch in <MainRepo>/.gitmodules 次のように

[submodule "<submodule_name>"]
    path = <submodule_name>
    url = [email protected]:ProProgrammer/<submodule_name>.git
    branch = new-submodule-branch

私が実行したときにこれを投稿してくださいgit submodule update --remote --init --recursive、コミット解除するために、デタッチ状態のサブモジュールのHEADを元に戻すことはもうありませんが、それでも迷惑を表示し続けました

    modified:   <submodule_name> (new commits)

これまでのところ、公式の サブモジュールのgitリファレンス をフォローしていましたが、今度はさらにグーグルを実行することにしました Get git submodule to track a branch 、これははっきり言った

これを回避するには、リモートブランチの最新コードへのサブモジュールコミット参照に移動して更新する必要があります

最後に、私は避けようとしていたことをしました:

git add <submodule_name>
git commit --amend --no-edit # I combined this with the previous commit where I added the 'branch' value in .gitmodules

これがリモート(私の場合はgithub.com)にプッシュされた後の様子を確認したい場合は、この正確なコミットを見ることができます here

0
Deep