2012-04-04 16 views
17

In git, esiste un modo (semplice) per modificare l'indice in modo che vengano aggiunte solo le modifiche ai file già presenti in esso? Sembra un po 'complicato, ma quello che voglio ottenere è semplice.Aggiornamento dei file di stasi

consente di dire il mio indice si presenta così (un po 'messo a nudo git status uscita):

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: B 
#  modified: C 
# 
# Untracked files: 
#  D 

Alcune modifiche al B sono nell'indice, alcuni non sono. C non è stato messo in scena.

Come è possibile aggiornare B nell'indice (mettere in scena le modifiche non modificate) senza aggiungere C?

I.e. Vorrei per l'indice a guardare come questo:

# Changes to be committed: 
#  modified: A 
#  modified: B 
# 
# Changed but not updated: 
#  modified: C 
# 
# Untracked files: 
#  D 

In questo semplice caso si può naturalmente essere raggiunto con una semplice git add B, ma mi piacerebbe sapere se c'è una risposta semplice per il caso generale. Ho provato git add --refresh, ma se ho capito bene, questo aggiorna solo le informazioni sulle statistiche.

+0

si può mostrare un caso d'uso reale dove vorresti farlo? Non riesco a immaginarne nessuna (quando aggiungo un file e lo modifico di più, non significa automaticamente che vorrò aggiungere anche queste modifiche, specialmente quando non voglio aggiungere modifiche in altri file). –

+0

@JanHudec Probabilmente non avrei bisogno di questo se fossi più severo e toccassi solo quei file che dovrebbero andare nel commit ('B'). Comunque a volte vengo trascinato e inizio a fare cambiamenti che dovrebbero essere in un nuovo commit ('C'), quindi aggiungo' B' all'indice. Prima di impegnarmi rivedo sempre diff --cached e qualche volta pulisco qualcosa in 'B'. e questo è quando ho bisogno di questo. Immagino che potrebbe probabilmente essere risolto in un altro modo, ad esempio con lo stash – axelarge

+0

Il mio punto è, che quando stai facendo qualcosa nel file 'X' che dovrebbe andare in commit' B' e lasciarsi trasportare e fare cambiamenti che dovrebbero andare in commit 'C', alcune di queste modifiche sono spesso di nuovo' X'. In tal caso, si desidera aggiungere manualmente i singoli hunk e non solo aggiungere nuovamente il file 'X'. Ovviamente se vieni portato via, probabilmente hai notato qualcosa intorno al punto che stavi cambiando, ed è per questo che è improbabile che le modifiche extra non tocchino i file che fa il pugno. –

risposta

22

Il seguente comando aggiornare l'indice per contenere delle altre variazioni di B che non è stato ancora messo in scena:

git update-index --again 
+1

Ah, molto meglio del mio metodo! – torek

+0

Perfetto! Questo è esattamente ciò di cui avevo bisogno – axelarge

1

Non so di un modo del tutto banale per fare questo, ma:

git status --porcelain 

mostrerà file di B (e solo B) come stato "MM", quindi:

git status --porcelain | grep ^MM | cut -d' ' -f 2 

produrrà un elenco di tali file.

Non c'è nulla di male nel "re-aggiungere" A, però.

È inoltre possibile utilizzare git diff-index --cached --name-status HEAD. (Potrebbe essere necessario questo se il vostro Git è troppo vecchia per avere git status --porcelain.)

+0

Grazie, non sapevo --porcelain for status. – axelarge

+0

Attualmente è lo stesso di -s/--short, ma promette di continuare a essere analizzato dalla macchina, il che è importante se lo si inserisce in alcuni script. :-) – torek

+0

Ho provato 'stato git --porcelain | grep^[AM] M | cut -d '' -f 2- | xargs git add', ma fallisce con nomi di file che contengono spazi.Immagino che questa possa essere vista come un'altra domanda, ma forse puoi aiutare? Con xargs -0 non funziona affatto – axelarge

Problemi correlati