2009-12-01 16 views
6

Sto resuscitando un progetto di codice piuttosto vecchio, da quando usavo regolarmente CVS, come componente in un nuovo progetto che sono già stato lavorando sull'uso di git. Ho ancora accesso all'archivio CVS del modulo del vecchio progetto, quindi usavo git-cvsimport per ottenere la cronologia dei commit e andare da lì. Tuttavia, questo è solo creando un nuovo repository git all'interno di quello corrente. È del tutto possibile che ho bisogno di farlo come un processo multistep in cui vado CVS -> repository git fresco e poi uso qualcos'altro per farlo entrare nel repository git esistente.Come importare un modulo CVS esistente in una sottodirectory di un repository git esistente

L'esecuzione di questo in newproj/newsubdir ($ CVSROOT è già impostato correttamente nella mia configurazione shell):

git cvsimport -k -o master -u -s \- -A ~/Documents/cvs-authors.txt oldproj 

me ottiene un nuovo repository newproj/newsubdir/.git/con tutti i commit corretti (commenti, timestamp, cronologia), e con HEAD dove lo voglio.

Quello che voglio è che lo storico CVS si impegni come se fossero sempre in newproj/newsubdir/oldproj-file1, newproj/newsubdir/oldproj-file2, ecc. Nella mia esperienza, git ha la magia per fare questo tipo di cosa, ma non sono riuscito a trovare un ovvio adattamento alla mia situazione.

risposta

0

capito come fare quello che voglio in base a this answer for combining git repositories, usando git filter-branch per renderlo come se il modulo importato dal CVS era stata fusa direttamente nella sottodirectory desiderata nel repository git attuale

A partire da la directory contenente newproj, il repository git attuale:

% git cvsimport -k -u -s \- -A ~/Documents/cvs-authors.txt \ 
    -C newproj-sibling oldproj 
% cd newproj-sibling 
% git filter-branch --index-filter \ 
    'git ls-files -s | gsed "s-\t-&subdir/of/newproj/-" | 
    GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ 
    git update-index --index-info && 
    mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD 
% cd ../newproj 
% git pull ../newproj-sibling master 

Supponendo che la sottodirectory di destinazione nel repository git era completamente nuova, o almeno non conteneva file che nomi condivisi con quelli del modulo di CVS, l'unione deve spegnersi, senza intoppi.

Un avvertimento: ho gsed sopra perché il BSD sed che viene fornito con OS X non può fare escape di caratteri come \ t, e non mi sono ancora preso la briga di farlo.

2

Hai tre opzioni. Tutti iniziano con il cvsimport pulito, quindi vai avanti e fallo.

  1. Riferimento a repo come sottomodulo.
  2. Scarica il repository nel repository esistente e crea un unione secondaria per unire le cronologie.
  3. Esegui qualcosa di simile a # 3 e quindi regge l'albero in modo da intercalare i commit cronologicamente nel corso della storia.

Il numero uno significa che il progetto esterno si basa sull'interno, ma probabilmente non è desiderabile per te.

Il numero due è spiegato in questo subtree merge howto. Potrebbe essere abbastanza buono per te.


Ma se vi piace una bella storia lineare, pulita, si può fare # 3 e li groviglio per bene. Ho fatto something similar in un progetto di pulizia un po 'indietro e ho un sacco di documentazione e strumenti ancora lì.

L'idea di base era quella di separare tutte le modifiche in una cronologia delle patch che avrebbe ricostruito le modifiche. Per impostazione predefinita, questa cronologia si trova in una sorta di ordine di repository, ma l'esecuzione dello script che ho menzionato nel post ridisporre le patch in una nuova sequenza in ordine cronologico.

L'albero di hash dovrebbe farti sapere che non hai infranto nient'altro che il lignaggio.

Se dovessi farlo di nuovo, probabilmente emetterei un file di grafts e farei un filter-branch.

+0

D'oh hai risposto mentre stavo rispondendo. Maledizione mia impazienza! – UltraNurd

Problemi correlati