Gitサブモジュールには新しいコミットが表示され、サブモジュールの状態にはコミットする項目は表示されません。

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リポジトリはなぜ文句を言うのですか?

答え1

ちょうど同じ問題が発生し、提供されたソリューションを使用することができました。@オーガスティンアメナバル許可された回答のコメントセクションにあります。私の設定は少し複雑なので、--recursiveすべての依存関係を最新の状態に保つためにフラグを追加しました。

git submodule update --recursive src/repo

答え2

これは、Gitが各サブモジュール(ブランチやタグではなくSHA-1ハッシュで表されるコミット)に対してどのコミットをチェックアウトする必要があるかを追跡するためです。サブモジュールディレクトリで何かを変更すると、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

答え3

ここにある答えのどれも私の問題を解決しません。

ここは私に合ったものを記録/共有するところです。他の人に役立つことを願っています。

最初、私のサブモジュールはコミット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コミットAに対してサブモジュールのHEADが切り離された状態に戻ります。

次に、分岐値をnew-submodule-branch次のように設定します。<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コミットAに対して実行してもサブモジュールのHEADは分離された状態に戻りませんが、まだ不快なコンテンツは引き続き表示されます。

    modified:   <submodule_name> (new commits)

これまで私は公式をフォローしていました。サブモジュールへのgitリファレンス今、もう少しインターネット検索をすることにしました。gitサブモジュールがブランチを追跡できるようにする、これははっきりと示しています。

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

それで結局私は避けようとしたことをしました。

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)にプッシュした後の外観を見るには、次の正確なコミットを見ることができます。ここ

関連情報