O submódulo Git mostra novas confirmações, o status do submódulo não diz nada para confirmar

47

Em um repositório git, configurei meu arquivo .gitmodules para referenciar um repositório github:

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

quando eu 'status git' neste repositório, ele mostra:

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)

Se eu entrar no status src / repo e git no repo, ele diz que não há nada a ser confirmado.

Por que meu repositório Git de nível superior está reclamando?

Catherine Holloway
fonte

Respostas:

42

É porque os registros Git que confirmam (não uma ramificação ou uma tag, exatamente uma confirmação representada no hash SHA-1) devem ser retirados para cada submódulo. Se você alterar algo no diretório do submódulo, o Git o detectará e pedirá que você confirme essas alterações no repositório de nível superior.

Execute git diffno repositório de nível superior para mostrar o que realmente mudou o Git pensa. Se você já fez alguns commit no seu submódulo (portanto, "limpo" no submódulo), ele relatará a alteração de hash do submódulo.

$ 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

Caso contrário, ele mostra a -dirtyalteração de hash que você não pode preparar ou confirmar no repositório de nível superior. git statustambém afirma que o submódulo possui conteúdo não rastreado / modificado.

$ 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")

Para atualizar quais registros de confirmação devem ser retirados do submódulo, você precisa git confirmar o submódulo, além de confirmar as alterações no submódulo:

git add src/repo
yaegashi
fonte
1
E se eu não quiser adicionar nenhum commit no repositório principal? Meu caso de uso é - eu tenho um repositório principal e, em seguida, um wiki, que também é um repositório (conforme disponível no GitHub e Bitbucket). Agora eu adicionei o wikicomo um submódulo em um diretório wiki . Eu não quero que nenhuma das minhas alterações no wiki(ou seja, no diretório wiki ) reflita no meu repositório principal / código. Devo apenas adicionar o .gitmodules caminho no meu .gitignorerepositório principal? Como devo fazer isso?
Yadav_vi 28/05
14
No meu caso, tudo que eu precisava fazer era atualizar o próprio submódulo a partir do repositório principal. Algo como:git submodule update src/repo
Agustín Amenabar
19

Acabei de encontrar essa mesma classe de problemas e pude usar a solução oferecida por @AugustinAmenabar na seção de comentários da resposta aceita. Como minha configuração era um pouco mais complexa, adicionei o --recursivesinalizador para atualizar todas as dependências.

git submodule update src/repo --recursive

Zak
fonte