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


47

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 statusを実行すると、コミットするものがないと表示されます。

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

回答:


42

これは、サブモジュールごとにコミット(ブランチまたはタグではなく、SHA-1ハッシュで表される正確に1つのコミット)をGitが記録するためです。サブモジュール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

1
メインリポジトリにコミットを追加したくない場合はどうすればよいですか?私のユースケースは-メインのリポジトリがあり、次にリポジトリでもあるウィキがあります(GitHubおよびBitbucketで利用可能)。これでwiki、サブディレクトリとしてwikiディレクトリに追加しました。メイン(コードリポジトリ)に反映された変更wikiウィキディレクトリなど)を望まない。メインリポジトリの.gitmodules パスを追加するだけ.gitignoreですか?どうすればいいですか?
yadav_vi

14
私の場合、メインリポジトリからサブモジュール自体を更新するだけで済みました。:ような何かgit submodule update src/repo
アグスティンAmenabar

19

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

git submodule update src/repo --recursive

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.