2009-11-15 20 views
20

Ho letto in varie domande frequenti che git non tiene traccia in modo esplicito di nomi/movimenti, preferendo cercare file identici (o in alcuni casi simili?). È grandioso, ma riuscirà a far fronte a questa situazione: il repository remoto di un amico ha una nuova funzione (i18n) che riguarda alcuni nuovi file allo debian/po/*.po. Ho il mio fork di questo progetto, e voglio unire questa funzione, ma mettere i file a solo po/*.po (posso farlo come due commit, o qualunque cosa sia necessaria). Mi aspetto che il repository remoto continui a ricevere gli aggiornamenti della funzione e voglio semplicemente unire/selezionare questi commit e applicarli ai file nella mia nuova posizione. Può fare git, magari con una sorta di mappatura di "questi file sono stati spostati qui ora"? O è più doloroso di quanto valga la pena e dovrei semplicemente accettare il percorso leggermente dispari debian nel mio repository?Spostare un file/directory, ma ancora unire facilmente le modifiche?

risposta

45

utilizzare git mv e tutto sarà AOK.

Perché non provarlo invece di chiedere? Puoi sempre resettare facilmente in git. :)

+21

Beh, volevo solo vedere se qualcuno ha rilevato dei trucchi che potrebbero emergere in seguito se qualcosa di strano che non ho provato si verifica nel repository remoto e non ho controllato il pollo magico corretto quando ho fatto il movimento o che si fondono. Ho usato git solo da poche settimane, e ho ancora una dose (non) salutare di paranoia rimasta da VCS minori. :-) –

+0

Se i file sono divergenti, allora avrà problemi a rintracciare la modifica, ma avrà il problema se lo si rinomina o meno;) – Pod

+0

Grazie, sembra davvero tutto OK finora. –

2

In alternativa, rinominare i file utilizzando mv e richiamare git add --all per mettere in scena tutte le operazioni di eliminazione e aggiungere i file non tracciati (i nuovi nomi di file). Senza --all, è necessario eseguire separatamente le operazioni di eliminazione e i nuovi nomi di file in modo esplicito. Non utilizzare neanche git add --update, poiché ciò consentirà di eseguire tutte le operazioni di eliminazione, ma non aggiungerà i nuovi nomi di file.

Si noti che è probabile che si desideri eseguire queste operazioni in un ramo locale in modo tale da non inavvertitamente lo push al ramo principale del proprio amico o il proprio amico non lo pull nel suo ramo principale.

3

Git manca un meccanismo per indicare che ci si aspetta che ci sia percorso rinomina e aggiornamenti quando si fa la diff tra due progetti/rami ecc

Ci sono i vari file di opzioni rinominare disponibili (come ad esempio -M e --pazienza) ma può essere lento.

Come già detto, le rinominazioni dei percorsi non influiscono sul repository stesso perché è semplicemente un'istantanea del contenuto (blob) e della struttura (nodi dell'albero). Se tutto ciò che hai fatto è stato aggiunto ad una directory di livello superiore, tutti gli alberi e i blob sottostanti sono invariati e richiedono zero storage aggiuntivo. Tutto ciò di cui hai bisogno è il nodo ad albero per il tuo commit e un nodo ad albero per il nuovo tld. Morto facile. Git gestisce quella parte senza problemi.

È solo quando si desidera eseguire un confronto (e qualsiasi patch) che è importante. Sarebbe bello dire un'opzione -P che indica che ci si aspetta qualche rinominazione del percorso e che lo diff sia così facilmente gestibile. Non è bello vedere 200 file eliminati e 200 nuovi file ;-)

Scoprire come aggiungere un'opzione -P è un'altra delle mie voci di lista 'da fare' (spero di avere un po 'di tempo per farlo).

Problemi correlati