2010-12-13 19 views
10

Sto eseguendo un refactoring del mio progetto C++ contenente molti file sorgente. L'attuale fase di refactoring include l'unione di due file (ad esempio, x.cpp e y.cpp) in uno più grande (ad esempio, xy.cpp) con un codice che viene espulso e un altro codice aggiunto ad esso.Come unire due file in un sistema di controllo versione

Vorrei dire al mio sistema di controllo versione (Perforce, nel mio caso) che il file risultante è basato su due file precedenti, quindi in futuro, quando guardo la cronologia delle revisioni di xy.cpp, vedo anche tutti i modifiche mai apportate a x.cpp e y.cpp.

Perforce supporta la ridenominazione dei file, quindi se y.cpp non esistesse saprei esattamente cosa fare. Perforce supporta anche la fusione, quindi se avessi 2 versioni differenti di xy.cpp, potrebbe crearne una versione. Da questo, ho capito che è possibile unire due file diversi (non ne sono sicuro); tuttavia, ho cercato attraverso alcuni documenti su Perforce e altri sistemi di controllo del codice sorgente e non ho trovato nulla di utile.

È quello che sto cercando di fare possibile a tutti?
Ha un nome convenzionale (la ricerca della documentazione su "unione" o "unione" non è andata a buon fine)?

+2

+1 fino a quando non hai chiesto, non mi è mai venuto in mente quanto utile potrebbe essere qualcosa del genere. –

risposta

1

Non penso che si possa fare in un classico VCS.
Questi sistemi di versioning sono di due tipi (scivolo 50+ di Getting git by Scott Chacon): storia a base di delta

  • : si prende un file, e registrare il suo delta. In questo caso, essendo l'unità il file, non è possibile associare la sua cronologia a un altro file.

  • cronologia basata su DAG: si prende uno contenuto e si registrano le sue patch. In questo caso, il file stesso può variare (può essere rinominato/spostato a piacimento) e può essere il risultato di altri due contenuti (quindi è vicino a ciò che si desidera) ... ma ancora nella cronologia di un file (i contenuti provenienti da diversi rami del suo DAG).

alt text

3

Si potrebbe provare l'integrazione con unioni prive di fondamento (-i nella riga di comando). Se capisco la documentazione correttamente (e non l'ho mai usata da sola), questo costringerà l'integrazione di due file. Dovresti quindi risolvere l'integrazione come preferisci, risultando in qualcosa vicino al file che stai immaginando.

Dopo aver fatto ciò, presumo che la cronologia Perforce mostrerà l'integrazione dal file non correlato nella sua cronologia di integrazione, consentendo di rintracciare quel file quando lo si desidera.

+0

Ho provato a farlo; non ha funzionato Mi suggerì di fare un'unione a 3 vie con la prima (antica) versione di 'x.cpp' come una" versione base ". – anatolyg

1

La parte più semplice sarebbe questo:

p4 edit x.cpp y.cpp 
p4 move x.cpp xy.cpp 
p4 move y.cpp xy.cpp 

Poi la parte difficile diventa risolvere la mossa di y.cpp e fare la vostra refactoring. Ma questo dirà a Perforce che i file sono combinati.