2010-01-27 18 views
5

Vorrei utilizzare Git per i miei scopi personali e devo utilizzare il repository Subversion nella mia azienda. So che esiste il comando 'git svn' ma richiede la cronologia del lineral anche nel repository git. Il problema è che vorrei: - sincronizzare il repository git con un altro mio repository git sul mio disco remoto in modo da poterlo sincronizzare con un altro repository git su un altro computer, - e il più importante: mi piacerebbe commit frequentemente nel mio repository git e quando decido che questi piccoli passi valgono la pena di impegnarsi (abbastanza grande da condividerli) mi piacerebbe commetterli a svn ma con un solo commit ... Quindi non vorrei mostrare tutti i miei git (mayby ​​a volte stupido, troppo piccolo si limita a ricordare qualcosa) in svn, - e con 'git svn' non posso usare i rami (perché quando li unisco con il master, il master non avrà la storia del lineral).Usa Git per conto mio e Subversion in azienda

Si prega di aiuto ... Forse c'è un flusso di lavoro in cui posso usare git nel suo pieno splendore e svn per impegnare più grande (non il mio 'privato' ... forse piccole modifiche e che per qualche tempo casue quel merluzzo non compila) modifiche al repository della mia azienda.

Grazie in anticipo!

risposta

8

Vorrei sincronizzare il repository git con un altro mio repository git sul mio disco remoto in modo da poterlo sincronizzare con un altro repository git su un altro computer.

Prova:

git remote add external-repo ssh://host/path/to/git/repo.git 
git push origin external-repo 

Vorrei impegnarsi frequentemente nel mio repository git e quando decido che questi piccoli passi sono la pena di impegnarsi (abbastanza grande da condividere) vorrei commettere li a svn ma con un solo commit.

Nessun problema. Comprimi più commit con git rebase -i (questo è chiamato "schiacciamento") e decidi se vuoi mantenere, buttare via o schiacciare ogni commit in uno più grande. È molto utile organizzarsi prima di spingere a un repository esterno. Il -i è per la modalità "interattiva".

con 'git svn' Non posso usare rami (perché quando li unisco con il master, il master non avrà la storia del lineral).

Non è vero. Basta impostare una filiale su git per ogni ramo che si desidera tracciare con svn. Nella direzione opposta, stai solo spingendo un ramo alla volta comunque.

2

Lavoro in questo modo tutto il tempo nella mia azienda (davvero non sopporto più la sovversione). Cosa ti fa pensare che non puoi usare le filiali con git svn? Non solo puoi usarli, puoi anche trasferirli direttamente in sovversione.

Per eseguire la fusione di commit si utilizza qualcosa come git rebase remotes/trunk --interactive e lo squash si commette insieme. Tuttavia, non è possibile mantenere contemporaneamente la versione espansa e le versioni condensate. O prendi tutti i piccoli piccoli commit o ottieni quelli schiacciati.

+0

c'è una videocast che mostra questo flusso di lavoro? questo suona come qualcosa che mi piacerebbe provare, Cheers – roundcrisis

+0

Grazie per la risposta rapida. Ma cosa succede se mi piacerebbe avere una storia dettagliata da sola e di conseguenza non so cosa schiacciare commette? rami ... Posso avere solo i miei rami (non condivisi in svn)? Per quanto mi riguarda, non posso unire il mio ramo con il master e poi fare nel master git svn ... perché il master non avrà una storia lineare. Qual è la tua migliore pratica per lavorare personalmente con git e con svn in compagnia? Potresti mostrare il tuo flusso di lavoro con i comandi di esempio? – miki

+0

@miki: Re Branches - sì quelli (non condivisi in svn) erano quelli di cui stavo parlando. Puoi creare tutti i rami che vuoi e unirli nuovamente al master prima di tornare a svn. O puoi scappare direttamente da quei rami a svn. –

2

Invece di rebase interattivo è anche possibile utilizzare git merge --squash sul ramo "ufficiale".

git checkout master 
git merge --squash development 

Questo ha il vantaggio che non distruggerà la cronologia di sviluppo. Ora puoi creare un grosso commit contenente tutte le tue modifiche, oppure puoi resettare l'indice (usando git reset) e usare git add -p o git gui per creare un numero qualsiasi di commit separati dal tuo ramo che poi dovresti commettere normalmente su master e git-svn dcommit quando appropriato .

1

Quello che faccio (e il modo più semplice per farlo) è non tentare di gestire due metodi di controllo del codice sorgente contemporaneamente. Io uso git per il mio controllo di versione personale. Alcune volte alla settimana, quando sono pronto per eseguire il commit nel repository centrale, controllo il ramo master in git e lo invio a TFS. Le modifiche dal server sono verificate nel mio ramo dev e sono state reinserite nel mio codice.

Non è elegante, in nessun modo, ma dal momento che sto solo check-out/check-in dal repository centrale alcune volte a settimana, funziona perfettamente.