2012-11-18 6 views
27

Sto cercando un modo per "nascondere" le modifiche minori apportate a pochi file in Git, in modo che non vengano visualizzate nello stato git fino a quando non viene apportata una modifica diversa a quelle File.Git - Ignora temporaneamente modifiche banali ai file

Esempio: dispongo di un file java in cui l'unica modifica apportata è la rimozione di un'importazione non utilizzata (un contributore ha dimenticato di eseguire un'organizzazione di importazione prima di eseguire il commit). Ora ho rimosso quell'importazione e il cambiamento (ovviamente) compare in git. Dal momento che non ho altre modifiche da apportare a quel file, non mi piace davvero commettere il file come parte di un'altra modifica (non correlata) o di commettere questo cambiamento da solo. Certo, potrei annullare il cambiamento e applicarlo solo ogni volta che dovrò apportare modifiche a quel file, ma potrei "rischiare" di dimenticarlo.

Esiste un comando per tale attività? Funzionerebbe in qualche modo come il comando assume-immutato, ma in un modo non permanente.

Quale sarebbe il modo corretto per risolvere questo se nessun comando di questo tipo è disponibile?

Grazie in anticipo.

+1

Perché non è sufficiente creare un ramo "correzioni banale" per questo? – Mat

+0

@Mat quale sarebbe il guadagno da un tale ramo? Dovrei ancora unirmi al master per i cambiamenti banali da non mostrare. – Zelgadis

+0

Conserveresti tutti i cambiamenti più banali e li unirai ogni volta che è ok nel tuo ciclo di sviluppo. In questo modo non interferiscono con i "normali" commit, ma non vengono nemmeno dimenticati. – Mat

risposta

36

Nel mio caso d'uso (in via di sviluppo utilizzando un file di configurazione modificato sulla mia macchina personale, in esecuzione su un'altra macchina con la configurazione invariato), questa era la soluzione per me:

inizio ignorando modifiche a un file:

git update-index --assume-unchanged path/to/file 

mastio nuovamente il monitoraggio:

git update-index --no-assume-unchanged path/to/file 
+2

Hah, grazie per l'esempio di copia-incolla. Continuo a dimenticare la sintassi esatta di questi a causa dell'uso poco frequente di questo: p –

+0

Questa è la soluzione migliore a questo. Originariamente pubblicato il 18 febbraio 2009, Fonte: http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html –

1

Ci sono diversi modi [anche se non può essere pulita e ordinata e richiederebbe l'attenzione]

  1. Aggiungere il file nella preoccupazione per .gitignore in pronti contro termine in modo che non si presenta per commettere. Prestare attenzione a rimuovere questo da .gitignore quando si è pronti a eseguire il commit del file
  2. Assicurarsi di non "mettere in scena" il file mentre si esegue il resto delle modifiche. Potresti voler scrivere un wrapper su git che assicuri che comandi come git commit -a o git add . funzionino su tutti tranne il file in questione. Un'altra alternativa potrebbe essere quella di utilizzare git gui o git citool in cui è possibile garantire visivamente che il file non si trovi nell'area "staged" e quindi non venga mai eseguito il commit
  3. Un altro modo sarebbe quello di commettere tutte le modifiche "committenti" e quindi git stash save l'unico funzionante file. Più tardi, quando sei pronto per cambiare il file, puoi git stash pop e continuare a lavorare e a impegnarsi.

Speranza che aiuta :)

+1

La prima soluzione purtroppo non funziona, poiché i file sono già tracciati. Un mix di 2 e 3 è quello che sto usando in questo momento, ma vorrei qualcosa di più automatico. Grazie comunque per la risposta! – Zelgadis

+0

Sfortunatamente, 'git' non può ancora leggere la mente dello sviluppatore per capire se un cambiamento è importante (e dovrebbe essere commesso) o meno (tenerlo fuori). Le opzioni più pulite sono (a) una diramazione separata per "correzioni insignificanti", rebasate regolarmente e unite in alcuni punti; (b) contrassegna le modifiche come "banali" nel messaggio di commit. IMHO (b) è preferibile, in quanto evita inclinazioni e versioni che nessuno ha mai testato. – vonbrand

3

Tenere le modifiche che non sono pronti in un ramo separato. git rebase questo ramo in cima alle nuove modifiche nella cronologia principale, se necessario.

Sia lo sviluppo in corso, le cose temporanee, anche le cose che non devono mai essere incluse nella cronologia del progetto principale - lo stesso processo funziona ugualmente bene.

Se/quando i cambiamenti del ramo sono pronti per essere inclusi nella cronologia principale; Unificalo. Se no, tienilo nel ramo separato e continui a ridiscutere.

(lato nota: git merge --no-ff possono essere utili per creare una stampa-commit, anche se una fusione fast-forward è possibile - a seconda delle regole del progetto, questo potrebbe essere preferibile)

+0

Questo è quello che ho trovato la soluzione che funziona meglio per me. Grazie! – Zelgadis

+0

Prego! Sono felice di poterti aiutare. – jsageryd

1

Proprio don' t aggiungere i piccoli cambiamenti.

È buona prassi esaminare attentamente le cose che si aggiungono prima di impegnarsi.

È anche possibile ignorare alcune modifiche in un file mentre l'aggiunta di altri, usando

git add -p. 

Questo è ancora più facile se si utilizza gitx (R).