Git submodule mostra nuovi commit, lo stato del sottomodulo non dice nulla da impegnare


47

In un repository git, ho impostato il mio file .gitmodules per fare riferimento a un repository github:

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

quando 'git status' su questo repository, 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 inserisco cd in src / repo e lo stato git su repo, si dice che non c'è nulla da impegnare.

Perché il mio repository git di alto livello si lamenta?

Risposte:


42

È perché i record Git che eseguono il commit (non un ramo o un tag, esattamente un commit rappresentato nell'hash SHA-1) devono essere verificati per ciascun sottomodulo. Se modifichi qualcosa nella directory del sottomodulo, Git lo rileverà e ti solleciterà a eseguire le modifiche nel repository di livello superiore.

Esegui git diffnel repository di livello superiore per mostrare cosa pensa Git in realtà. Se hai già effettuato alcuni commit nel tuo sottomodulo (quindi "pulito" nel sottomodulo), segnala la modifica dell'hash del sottomodulo.

$ 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

Altrimenti mostra il -dirtycambiamento di hash che non è possibile mettere in scena o eseguire il commit nel repository di livello superiore. git statusafferma inoltre che il sottomodulo ha contenuti non monitorati / modificati.

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

Per aggiornare quali record di commit devono essere estratti per il sottomodulo, è necessario eseguire il commit di commit del sottomodulo oltre a confermare le modifiche nel sottomodulo:

git add src/repo

1
Cosa succede se non desidero aggiungere alcun commit nel repository principale? Il mio caso d'uso è: ho un repository principale, quindi ho la sua wiki che è anche un repository (come disponibile in GitHub e Bitbucket). Ora ho aggiunto il wikisottomodulo in una directory wiki . Non voglio che nessuna delle mie modifiche dalla wiki(cioè la directory wiki ) si rifletta nel mio repository principale / di codice. Devo solo aggiungere il .gitmodules percorso nel mio .gitignorerepository principale? Come devo procedere?
yadav_vi,

14
Nel mio caso, tutto quello che dovevo fare era aggiornare il sottomodulo stesso dal repository principale. Qualcosa del tipo:git submodule update src/repo
Agustín Amenabar,

19

Ho appena incontrato questa stessa classe di problemi e sono stato in grado di utilizzare la soluzione offerta da @AugustinAmenabar nella sezione commenti della risposta accettata. La mia configurazione è stata un po 'più complessa, quindi ho aggiunto il --recursiveflag per aggiornare tutte le dipendenze.

git submodule update src/repo --recursive

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.