2009-10-13 7 views
11

La situazione è che ho passato un po 'di tempo a cercare un codice sperimentale. Ora voglio spostare parte di quel codice - circa 500 righe - in un altro file, ma non voglio perdere la cronologia, come farei se faccio un semplice editor di testo da tagliare e incollare.Utilizzo di Subversion, come posso tagliare da un file e incollarlo in un'altra cronologia di conservazione

Per quanto io sappia come ottenere è necessario separare il codice dal file originale - svn copy, quindi eliminare roba indesiderata da entrambe le copie. Ma non so come aggiungere la copia parziale su un file esistente, mantenendo la cronologia da entrambi.

La ragione per cui questo è importante è che il codice è solo roba abbastanza specializzata, per aiutare a implementare alcune funzioni di livello superiore. Non voglio che inquinini gli spazi dei nomi globali, quindi voglio tutto in un unico file in cui verrà utilizzato e racchiuso in uno spazio dei nomi anonimo.

Mi rendo conto che sembra unire un ramo nel bagagliaio. Il fatto è che non c'è un ramo. Il codice sperimentale non è iniziato come una copia di qualcosa - è solo un mucchio di codice avviato da zero. Il file da cui voglio tagliare e quello che voglio incollare sono file completamente indipendenti.

Uso principalmente TortoiseSVN, ma ho installato anche la sovversione della riga di comando.

risposta

16

È possibile unire tutte le revisioni (o revisioni specifici) di un file in un altro come questo

svn merge sourcefile targetfile -r 0:HEAD 

In un primo momento ho pensato che si dovrebbe utilizzare l'opzione --ignore-ancestry (dal momento che entrambi i file non condividono alcun comune storia) ma a quanto pare non è necessario. Ho provato con svn 1.6.3.

Ovviamente è molto probabile ottenere molti indicatori di conflitti nel risultato di unione. Potrebbe essere più facile fare l'unione manualmente (una copia e incolla unisci come dici tu), quindi esegui il comando di fusione sopra con --record-only per dirlo a subversion.

Dopo l'unione, lo targetfile avrà una proprietà svn:mergeinfo che indica il commit da sourcefile in cui è stato fuso. Quando si esamina il registro di targetfile, si può vedere la storia di entrambi i file utilizzando l'opzione --use-merge-history. TortoiseSVN ha la stessa funzionalità sotto forma di una casella di controllo nel modulo di registro.

+0

È abbastanza intelligente. –

+0

Sospetto che questo non farà esattamente quello che voglio, ma sono convinto che sia il migliore che otterrò (a corto di svn dump hacking), quindi accetto. Grazie. – Steve314

+0

Potrai avere il registro commit, ma tutte le linee le modifiche avrà lo stesso marcatore revisione nel 'colpa'. –

1

Se si desidera copiare in un nuovo file e cancellare il vecchio file:

svn mv 

Se si desidera duplicare in un nuovo file:

svn copy 

Se entrambi file esiste già:

# copy/paste with a text editor 

È possibile eliminare un file di mantenere la sua storia con:

svn del 

Con SVN non è possibile tenere traccia della cronologia di un'unione di due file. È possibile unirlo manualmente e mantenere una traccia nel messaggio di commit.

+0

Nessuno di questi mi invia un file contenente testo (e la storia) da due file di origine. Editor di testo copia/incolla custodisce la storia sia nel repository, vera - nulla è mai cancellato - ma la storia dal file si taglia da si stacca dal file che si è incollato a. In termini di TortoiseSVN, la colpa incolperà tutto sul "taglia e incolla", e non sulle persone che hanno preso le decisioni di codifica. – Steve314

+0

Tutti gli strumenti che Subversion ti offre. Probabilmente dovresti usare alcuni DVCS. TortoiseMercurial esiste per gli utenti Windows. – Natim

+0

Tra l'altro non capisco esattamente quello che ci si aspetta dalla fusione della storia di due file. non ha senso Che tipo di rollback hai in mente? È possibile aggiungere un commento all'inizio del file per dire che si tratta di un'unione di questo file e un altro nella revisione. RXXXX – Natim

4

Non penso che tu possa conservare la storia nel modo in cui stai descrivendo. SVN tiene traccia della cronologia su base file per file e non tiene traccia di due file separati che sono combinati insieme sulla stessa riga di codice.

Se si è iniziato con due file separati e poi li si combinano in un terzo, verrà conservata la cronologia di entrambi. Se ne combinate una nell'altra, la storia di una di esse verrà "persa" nel senso che non sarete in grado di ricollegarvi alla cronologia del file "cancellato" solo guardando la cronologia.

Suppongo che ciò che si potrebbe fare è nel messaggio di commit, basta notare che il contenuto dell'altro file è stato combinato e quindi confermare l'eliminazione nello stesso commit.

+0

Avevo la sensazione che fosse la risposta. Non ancora accettato per il caso: ne avrò un altro domani, per ogni evenienza. – Steve314

-1

Non puoi lasciare il codice nel proprio file (dopo aver ritagliato le parti che non vuoi conservare) e includere questo file nel tuo file sorgente "reale"?

// file foo.cpp: 
... 
namespace { 
# include "util_code.inc" 
} 

Non proprio ortodossa, ma dovrebbe funzionare ...

+0

Non mi piace quello stile di #include uso. Mi sono abituato a convenzioni di questo tipo sono le convenzioni in altre lingue molto tempo fa. Questo è probabilmente il motivo per cui l'idea non mi è nemmeno venuta in mente - ma non è così male, suppongo, data una serie di scelte imperfette. Troppo tardi, questa volta, ma c'è sempre una prossima volta. – Steve314

+0

Grazie. Naturalmente non consiglierei un uso generale di tali direttive #include. Ma io l'ho usato per includere il codice generato: #define THE_CLASS MiaClasse # include method_bodies.inc con method_bodies.inc simile a questo: THE_CLASS vuoto :: generatedMethod() { ...} Sono stato quindi in grado di generare alcuni, ma non tutti i metodi di una classe senza che il generatore conoscesse il nome della classe. –

Problemi correlati