2010-10-15 10 views
16

Ho il compito di migrare la mia squadra & fonte da git a Perforce, e sto cercando idee su come spostare la cronologia git in p4.Migrazione da git a Perforce

Sarei felice solo con il master in movimento. Tuttavia, anche questo si sta rivelando problematico.

Sto usando il meraviglioso strumento git-p4. Creo un'area di destinazione nel mio spazio di lavoro p4 e utilizzo git p4 clone //depot/StuffFromGit per iniziare a rintracciarlo in git-p4. Innesto tutte le modifiche del mio repository git nel clone git-p4. Posso quindi git p4 submit ed essere fatto, tutti i cambiamenti sono passati a p4.

Funziona benissimo quando la storia git si presenta così, bella e lineare:

A---B---C---D 

Il problema arriva con più persone che lavorano al progetto. Anche se stanno lavorando su master, ciò crea ancora rami che si dividono e si fondono. Ancora, git-p4 gestisce con coraggio questo:

A---B---C---E 
    \--D--/ 

git p4 attraversa OK, commettendo ABCDE in ordine (o la storia ABDCE, sia della persona in primo luogo).

Il problema si presenta quando, ad esempio, C e D cambiano entrambi lo stesso file, ed E è una unione reale e onesta. git p4 rebase non riesce qui; riavvolgerà i commit, ma durante la riproduzione applicherà prima C, quindi tenterà D e troverà un conflitto. Si fermerà quindi, chiedendomi di unirmi. Bene, E contiene l'unione ma mi sta chiedendo di fondere a mano! 'git p4 submit' fallirà in modo simile, solo ora è p4 rifiutando la modifica pre-unione.

 
Using index info to reconstruct a base tree... 
Falling back to patching base and 3-way merge... 
Auto-merging main.cpp 
CONFLICT (content): Merge conflict in main.cpp 
Failed to merge in the changes. 
Patch failed at 0005 Changing main 

Quindi ora sono bloccato. C'è un modo per disinfettare la cronologia git o per ottenere git-p4 per capirlo? È frustrante come le unificazioni ci sono.

pensieri che ho avuto:

  • Usa git filter-branch per rimuovere tutti menzione di file in conflitto. Mi piacerebbe avere i commenti storici, anche se mancano molte modifiche ai file. Con circa 3000 commit nella storia, vorrei finire per rimuovere tutta la cronologia dei file (occupati) dei tasti. Alla fine dell'importazione dei file filtrati, aggiungerei i file mancanti eseguendo un commit finale dell'HEAD.
  • Eseguire il dump della cronologia, eseguire un singolo commit P4 dell'HEAD (semplice ma triste).
  • Non passare a p4: ho lavorato a quell'idea il più a lungo possibile.

Nessuno dei quali è veramente eccezionale. Qualche idea su come git 'gt p4 rebase' o 'git p4 submit' funziona?

+14

Data la storia di git, è una specie di direzione divertente da migrare. –

+2

Sembra che git-p4 stia cercando di unire C, D ** e ** E, e naturalmente fallendo miseramente. Hai controllato che stai utilizzando l'ultimo git-p4 e se ci sono alcune patch o altre persone hanno visto lo stesso problema? –

+16

Wow, amico, mi dispiace. Sembra che ti stia muovendo come 10-15 anni indietro. – Jonathan

risposta

6

L'opzione di "buttare via la vecchia storia" non è così male come sembra: puoi semplicemente tenere il tuo repository git accanto a sé per sempre, nel caso qualcuno debba scavare attraverso le vecchie cose. Sfortunatamente, non c'è modo di rappresentare la complessa visione della storia di git nei sistemi lineari vecchio stile come svn e p4.

Il motivo principale per guardare indietro nella storia precedente è per cose come 'git annotate' (presumo che p4 abbia uno strumento simile).Se è tutto ciò che vuoi, allora forse quello che vuoi veramente è di schiacciare tutti i tuoi commit in un solo genitore (in modo che assomiglino a un singolo commit anziché a un'unione). È più simile a ciò che svn e p4 avrebbero registrato nel proprio modello di cronologia, in cui le unioni appaiono come un singolo commit nel flusso lineare. Probabilmente puoi farlo con git-filter-branch o simili. Ovviamente, questo perderà tutta la cronologia che si è verificata nei sotto-rami ... ma gli utenti di p4 sono abituati a non avere quell'informazione.

+0

Perforce in genere non usa sub -branchi, ma può se vuoi gestire i rami. Quindi l'informazione è lì. –

-2

Penso che dovresti provare con Tortoise SVN e poi Hg considerando l'aggiornamento su un singolo ramo o puoi dire migrazione. Assicurati di avere tutta la discarica clonata per essere al sicuro. Buona fortuna!

2

Avete controllato lo strumento "su misura"? È costruito per sincronizzare diversi VCS: es. Dovrebbe avere il supporto Perforce.

Come nota a margine, la mia prima reazione sarebbe di mettere seriamente in discussione la decisione, ma suppongo che tu l'abbia già fatto.