Подмодуль Git показывает новые коммиты, статус субмодуля ничего не сообщает

47

В репозитории git я настроил свой файл .gitmodules для ссылки на репозиторий github:

[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 и git status, он говорит, что нечего коммитить.

Почему мой git-репозиторий верхнего уровня жалуется?

Кэтрин Холлоуэй
источник

Ответы:

42

Это потому, что записи Git, которые фиксируют (не ветвь или тег, ровно один коммит, представленный в хэше SHA-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
yaegashi
источник
1
Что если я не хочу добавлять коммиты в основной репо? Мой пример использования - у меня есть главный репозиторий, затем у меня есть его вики, который также является репозиторием (как доступно в GitHub и Bitbucket). Теперь я добавил wikiкак подмодуль в директорию вики . Я не хочу, чтобы какие-либо изменения из wiki(то есть из вики- каталога) отражались в моем репозитории main / code. Должен ли я просто добавить .gitmodules путь в моем .gitignoreосновном хранилище? Как я должен идти об этом?
yadav_vi
14
В моем случае все, что мне нужно было сделать, это обновить сам подмодуль из основного репо. Что-то вроде:git submodule update src/repo
Агустин Аменабар
19

Я столкнулся с этим же классом проблем и смог использовать решение, предложенное @AugustinAmenabar, в разделе комментариев принятого ответа. Моя установка была немного более сложной, поэтому я добавил --recursiveфлаг, чтобы привести все зависимости в актуальное состояние.

git submodule update src/repo --recursive

Zak
источник