2011-08-26 7 views
8

Spesso ho una situazione in cui ho un file di commit per git add ed ho quindi dovuto apportare una modifica a quei file in modo da finire con le modifiche su quegli stessi file in Changed but not updated.git aggiungi di nuovo solo i file che sono già stati messi in scena

C'è un solo rivestimento che posso eseguire su git add solo i file esistenti negli elenchi Changed but not updated e Changes to be committed?

markdsievers$git status 
# On branch master 
# 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
# modified: src/com/foo/Bar.java 
# modified: src/com/foo/Foo.java 
# 
# Changed but not updated: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
# modified: src/com/foo/Bar.java 
# modified: src/com/foo/Foo.java 
# modified: src/com/foobar/FooBar.java 

Per l'esempio di cui sopra voglio solo Foo.java e Bar.java ma non FooBar.java aggiunto alla lista Changes to be committed:.

+0

Stai pensando a qualcosa di diverso da 'git add -u'? –

+0

'git add -u' sembra voler un filepattern altrimenti usa' .' che aggiungerebbe 'Foobar.java'. Sì, potrei aggiungere un file pattern per ottenere il mio esempio forzato e che funzionerebbe, ma le modifiche sono raramente così semplici che un singolo modello di file potrebbe funzionare. – markdsievers

risposta

4

Questo è un modo:

git add -u $(git status --porcelain | grep ^MM | cut -d ' ' -f 2) 
+0

Ciao, grazie per questo. Non sapevo di '--porcelain'. Non pensavo che questa fosse una caratteristica irragionevole da chiedere a git, anche se forse è il mio flusso di lavoro che ha bisogno di essere aggiustato. – markdsievers

+0

Questo non ha funzionato per me ... Cerca di aggiungere file modificati ma non ancora messi in scena. – Darien

+0

+1! Ma funziona solo nella directory root di git, e usando 'git status -s', invece, funzionerà in qualsiasi directory. – pktangyue

0

La risposta accettata non funziona se i nomi dei file contengono uno spazio. Anche -u è inutile è questo caso, ma aggiungerà tutti i file non gestiti se non ci sono file che sono entrambi nella lista Changed but not updated e Changes to be committed. Usare questo invece:

git add $(git status -z | perl -0ne 'print $1 if $_ =~ /^MM(.*)$/') 

Questo funziona solo per i file che vengono modificati solo. Se si desidera che questo funziona per i file che vengono eliminati, ha aggiunto, rinominato o copiato pure, utilizzare questo:

git add $(git status -z | perl -0ne 'print $1 if $_ =~ /^[MADRC][MD](.*)$/') 

Ma attenzione con ultima. Ad esempio, se il file viene aggiunto all'indice, ma la sua eliminazione non è attiva, l'esecuzione di questo comando eliminerà anche il file nell'indice, causando la perdita del contenuto di quel file.

Si noti che entrambi funzioneranno solo dalla directory principale del repository Git.

Problemi correlati