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.