Come sbarazzarsi dello stato non tracciato dei sottomoduli Git?


149

Non riesco a sbarazzarmi di contenuti non tracciati nei sottomoduli di Git. git statusRendimenti correnti :

# Sul branch master
# Modifiche non messe in scena per il commit:
# (usa "git add ..." per aggiornare ciò che sarà commesso)
# (usa "git checkout - ..." per scartare le modifiche nella directory di lavoro)
# (esegue il commit o elimina il contenuto non tracciato o modificato nei sottomoduli)
#
# modificato: bundle / snipmate (contenuto non tracciato)
# modificato: bundle / surround (contenuto non tracciato)
# modificato: bundle / trailing-whitespace (contenuto non tracciato)
# modificato: bundle / zencoding (contenuto non tracciato)
#
nessuna modifica aggiunta al commit (usa "git add" e / o "git commit -a")

L'aggiunta del --ignore-submodulesparametro nasconde questi messaggi; ma mi chiedo se c'è un modo per sbarazzarsi di questo sporco in un modo più adatto, core-ish,.


3
Questa risposta: stackoverflow.com/a/5127213/199649 evoca ulteriori opzioni.
charlax,

Risposte:


95

Dal momento che lo stato git riporta contenuti non tracciati, il modo effettivo di avere uno stato pulito sarebbe quello di andare in ciascuno di quei sottomoduli e:

  • aggiungere e impegnare i contenuti non tracciati,
  • o fare riferimento ai contenuti non tracciati in uno .gitignorespecifico per ciascun modulo.
  • oppure è possibile aggiungere lo stesso contenuto ignorato al modulo di .git/info/exclude, come peci1 rapporti nei commenti .
  • o aggiungere sporco alla specifica modulo, come detto in ezraspectre 's risposta (upvoted).

    git config -f .gitmodules submodule.<path>.ignore untracked
    
  • o aggiungi un file globale .gitignore (spesso ~/.gitignore-global). Come ad esempio .DS_Storeo nel mio caso, Carthage/Buildcome riportato da Marián Černý nei commenti . Vedi la .gitginorepagina man :

I pattern che un utente vuole che Git ignori in tutte le situazioni (ad es., Backup o file temporanei generati dall'editor di scelta dell'utente) generalmente vanno in un file specificato core.excludesFiledall'utente ~/.gitconfig. Il suo valore predefinito è $XDG_CONFIG_HOME/git/ignore. Se $XDG_CONFIG_HOMEnon è impostato o vuoto, $HOME/.config/git/ignoreviene invece utilizzato.


5
+1, ero quasi pronto a urlare fino a quando non ho trovato questo ... poi realizzando che un .DS_Storefile era stato creato automaticamente (da OS X) in uno dei miei sottomoduli, impedendomi di impegnare il progetto principale. Arg! È ora di aggiornare .gitignore...
Courtney Christensen,

Usando Xcode, ho anche trovato utile aggiungere * .xcuserdatad al file .gitignore-global. Questo impedisce a git di provare a tracciare le preferenze Xcode locali.
Roy Sharon,

Se non si dispone dei diritti push per il sottomodulo, non è possibile condividere le modifiche al sottomodulo con altri utenti del repository principale. La soluzione di @ quincyglenn sembra funzionare in questo caso.
Drew Noakes,

1
@VonC, entrambe le risposte hanno senso a seconda della situazione e delle preferenze. Volevo evidenziare la distinzione qui come riferimento ad altri. A proposito, grazie per le tue risposte su Git qui su SO - mi hai aiutato molte volte.
Drew Noakes,

2
Puoi anche fare a meno del commit e della creazione di un .gitignore (che a sua volta non viene tracciato). Apri il sottomodulo .git/info/excludee aggiungi lì le linee di ignore (funziona come un .gitignore, ma non fa parte del repository condiviso).
Martin Pecka,

144

Ho trovato questo post sul blog funzionante nel complesso. Aggiungendo l' ignore = dirtyopzione a ciascuna delle voci nel .gitmodulesfile.

[submodule "zen-coding-gedit3"]
    path = zen-coding-gedit3
    url = git://github.com/leafac/zen-coding-gedit3.git
    ignore = dirty

La mia soluzione preferita, poiché è facilmente automatizzata.
chitarra letale,

24
Vale la pena ricordare che ignore = untrackedesiste anche e mostra file tracciati modificati, ma non file non tracciati. Sarebbe bello se ci fosse un'impostazione globale per questo per tutti i sottomoduli ...
nulla101

12

Puoi anche andare in ogni directory del sottomodulo e agire come un git separato. Per esempio:

cd my/project/submodule
git status

... / ottiene l'elenco dei file modificati /

git add .  //to add all of them to commit into submodule
git commit -m "message to your submodule repo"

puoi anche aggiornare il tuo repository sottomodulo remoto con

git submodule update

Dopotutto


5
Probabilmente non vorrai fare a git add .meno di rivedere i file modificati. Il più delle volte, le modifiche che sono state apportate sono i .DS_Storefile aggiunti - questo dovrebbe probabilmente essere colto dal tuo .gitignore, come zourtney menzionato nel primo commento alla risposta.
Gregregtsov,

Nel caso in cui non si desideri aggiornare i sottomoduli e si desideri ripristinare lo stato originale, è possibile eseguire git submodule update --force.
Tom,

4

Potrebbe essere dovuto al detached HEADramo nel tuo sottomodulo. In questo caso, vai nel percorso del tuo sottomodulo (ad esempio:) ./bundle/snipmate, quindi esegui git checkout master.


2

Mi sono bloccato su questo problema ieri, in un progetto che aveva quasi 12 sottomoduli.

git status stava mostrando l'output.

# On branch master
# Changes not staged for commit:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#   modified:   proj1 (untracked content)
#   modified:   proj1 (modified content, untracked content)
#   ...

Per risolvere l'errore contenuti non tracciata, ho dovuto rimuovere i file non monitorate da tutti i sottomoduli (tutti erano *.pyc, *.pyofile generati da Python) usando un .gitignore.

Per risolvere l'altro, ho dovuto eseguire quello git submodule updateche ha aggiornato ciascuno dei sottomoduli.


1

Nella mia situazione ho clonato i moduli come punto di partenza per un nuovo modulo nel mio ambiente ZF2. Quello che fa è mettere la propria cartella .git nella directory.

La soluzione in questo caso è eliminare la cartella .git (probabilmente sarà necessario mostrare i file nascosti per visualizzarla).


1

Questo probabilmente accade quando hai un'altra .git [cartella nascosta] all'interno della cartella particolare ..

modificato: ./../ .. (contenuto modificato, contenuto non tracciato)

assicurati che la tua sottodirectory non contenga questa cartella .git.

In tal caso, il problema può essere risolto eliminando manualmente la cartella .git dalla sottodirectory.


1

Preferisco usare SourceTree , quindi la soluzione per me era aprire il repository del sottomodulo in SourceTree che mi mostra l'elenco di tutti i file non tracciati. Poi li ho selezionati tutti poi ho usato "Rimuovi".

Sono stato in grado di farlo perché sapevo che tutti i file non tracciati non erano effettivamente necessari.


1

Questo ha funzionato bene per me:

git update-index --skip-worktree <path>

Se non funziona con il pathname, prova il nome del file. Fammi sapere se questo ha funzionato anche per te.


-1

Se si tratta di un problema temporaneo, è possibile accedere alla cartella del sottomodulo ed eseguire git reset HEAD --hardma si perderanno tutte le modifiche all'interno del sottomodulo.

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.