Ignori un sottomodulo git nel tuo .gitignore o lo invii al tuo repository?


94

Ho aggiunto un sottomodulo al mio progetto in questo project_dir/vendor/submodule_onemomento ogni volta che eseguo git statusottengo modified: vendor/submodule_one (new commits).

La mia domanda è qual è il modo migliore per affrontare questo problema? Aggiungo la vendor/submodule_one-folder al mio .gitignoreperché il mio progetto principale non dovrebbe aver bisogno di conoscere le specifiche del mio sottomodulo?

O quando sto cambiando e inviando modifiche al mio sottomodulo, devo fare anche dei commit nel mio progetto principale?

Ho appena iniziato con i sottomoduli e non riesco a trovare molte informazioni oltre a configurarli.

Risposte:


81

No, non è necessario aggiungere il tuo sottomodulo al tuo .gitignore: quello che il genitore vedrà dal tuo sottomodulo è un gitlink (una voce speciale,mode 160000 ).

Ciò significa: qualsiasi modifica effettuata direttamente in un sottomodulo deve essere seguita da un commit nella directory padre.
In questo modo, la directory genitore registrerà il commit corretto per lo stato del sottomodulo: Quel commit è il "gitlink" menzionato sopra;

Puoi leggere ulteriori informazioni su questa politica in " aggiornamento del sottomodulo git (vera natura dei sottomoduli) ".
L'idea principale alla base dei sottomoduli è un approccio basato sui componenti , in cui si fa riferimento ad altri repository in specifici commit. Ma se modifichi qualcosa in quei sottomoduli, devi aggiornare anche quei riferimenti nel repository principale.


Nota che con Git 2.13 (Q2 2017), pur non ignorando il gitlink, puoi comunque ignorare il sottomodulo con:

git config submodule.<name>.active false

Vedere di più in " Ignora i nuovi commit per il sottomodulo git ".


Nota: con Git 2.15.x / 2.16 (Q1 2018), ignorare un sottomodulo è più preciso.
" git status --ignored --untracked" non si è fermato a un albero funzionante di un progetto separato che è incorporato in una directory ignorata e ha elencato i file in quell'altro progetto, invece di mostrare semplicemente la directory stessa come ignorata.

Vedere commit fadb482 (25 ottobre 2017) di Johannes Schindelin ( dscho) .
(Fuso da Junio ​​C Hamano - gitster- in commit da7996a , 06 nov 2017)

status: non farti confondere dai sottomoduli nelle directory escluse

Passiamo meticolosamente il excludeflag alla treat_directory()funzione in modo da poter indicare che i file in essa contenuti sono esclusi invece che non tracciati quando si ricorre.

Ma non abbiamo ancora trattato i sottomoduli allo stesso modo.

Per questo motivo , git status --ignored --untrackedcon un sottomodulo submodulein un gitignored tracked/mostrerebbe il sottomodulo nella sezione " Untracked files", ad es.

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

Invece, vorremmo che mostrasse il sottomodulo nella sezione " Ignored files":

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

1
Grazie VonC, ha perfettamente senso quando lo metti così.
sprysoft

8
Questa risposta è fonte di confusione perché il titolo della domanda chiede se ignorare o meno le cartelle del sottomodulo e stai rispondendo con sì a una domanda separata più avanti nel corpo della domanda.
SgtPooki

1
Penso che ora abbia molto più senso e fornisce alcune informazioni approfondite molto utili. Fantastico, grazie per l'aggiornamento :)
SgtPooki

Argomento per .gitignore: perché eseguire il check-in del file .gitsubmodules quando l'URL in esso contenuto potrebbe contenere un URL git specifico dell'utente con un parametro nome utente?
Djangofan

1
@djangofan la domanda (e la mia risposta) riguardava l'ignorare la cartella del sottomodulo stesso (quella che rappresenta un gitlink). Non ignorare il .gitmodulesfile. È vero che questo file (il .gitmodules) potrebbe includere credenziali, ma se usato solo per clonare repository pubblici, non deve includerli. Inoltre possono essere comunque memorizzati nella cache, anche su Windows, con helper credenziali come "Git Credential Manager for Windows" ( github.com/Microsoft/Git-Credential-Manager-for-Windows/… ). Quindi avere credenziali nella .gitmodulesnon è una fatalità.
VonC

8

Per qualche motivo submodule.module-name.active non ha funzionato per me.

Ecco perché ho usato submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - qui puoi trovare la descrizione dei possibili valori per il parametro

Funziona per me per (nuovi commit) e (contenuto modificato) messaggi.


1

Per aggiungere alla risposta accettata, ho scoperto che l'aggiunta della cartella del sottomodulo Git a .gitignore causa effettivamente problemi, in particolare quando si tenta di creare un nuovo clone del progetto. In particolare, l'esecuzione dei normali comandi di clonazione del sottomodulo ha comportato il vuoto della cartella del sottomodulo:

git submodule init
git submodule update
git pull --recurse-submodules

Solo provando a rieseguire

git submodule add <Git repo> <submodule folder>

era chiaro quale fosse il problema, in base all'output:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

Invece di aggiungere -f, ho rimosso la cartella del sottomodulo Git da .gitignore e ho rieseguito i comandi di clonazione del sottomodulo, che ora hanno creato con successo la cartella. Penso che ci possa essere un bug in quanto uno dei comandi di clone del sottomodulo rispetta .gitignore ma non avverte che sta saltando un sottomodulo di conseguenza.

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.