2009-09-11 28 views

risposta

18
git rebase remotes/trunk --interactive 

dovrebbe portare al menu dove si può prendere commit o li schiacciare in 1 impegnarsi al fine di evitare di inquinare il repository svn. This è una risorsa molto buona (ma breve) su come lavorare con git-svn.

+0

Questo sembra come un'ottima soluzione Non capisco quale sia l'effetto di telecomandi/trunk nel comando, il risultato finale è che tutti i miei commit sono schiacciati all'interno del master. Speravo che sarebbero stati schiacciati solo mandando a SVN. È necessario eseguire il commit su SVN dopo lo schiacciamento. –

+0

@MacRae Linton: tutti i tuoi doveri devono essere schiacciati nel master. Se non fossero git non avrebbero modo di mantenere sincronizzati i repository git e svn. Quando rebase per tirare le ultime modifiche svn avrebbe un commit ma in git avresti n commit. –

+0

@Jonon Punyon: Il problema che sto incontrando è che dopo lo schiacciamento commette in master, diventa difficile unire master con il mio ramo di sviluppo di nuovo. Praticamente tutti i miei cambiamenti diventano conflitti di fusione, il che è un enorme dolore da affrontare. Questa è una conseguenza inevitabile di tenere separato il mio ramo in via di sviluppo dal maestro schiacciato? –

17

No, ma è possibile eliminare tutti i commit insieme abbastanza facilmente. Per il seguente esempio, ho intenzione di assumere sei sul ramo master corrispondente al trunk ramo remoto e che si vuole schiacciare tutti i locali si impegna insieme:

git tag local # create a temporary tag 
git reset --hard trunk 
git merge --squash local 
git commit # write your single commit message here 
git svn dcommit 
git tag -d local # delete the temporary tag named local 

Invece di utilizzare un tag temporanea si potrebbe anche semplicemente usare il reflog (vale a dire utilizzare [email protected]{1} al posto di local)

+0

questo è assolutamente fantastico, questo cambia completamente il mio flusso di lavoro, molte grazie –

3

Quando lavoro con git-svn e voglio che una serie di commit di git compaia come un singolo commit, lavoro su un ramo di argomento e poi eseguo uno merge non-forward veloce in master prima di dcommit -ing.

In primo luogo, rebase vostro ramo contro svn e assicurarsi maestro locale è up-to-date:

git svn rebase && git push . remotes/trunk:master 

quindi passare a maestro, unire e dcommit:

git checkout master 
git merge <branch> --no-ff -m "Message you want in svn" 
git svn dcommit 

questo apparirà come singolo commit in Subversion ma avrai comunque la tua cronologia locale che ti ha portato a quel commit.

         +--- Merge commit 
             V 
svn trunk *---*---*-------------------*--- --- --- 
        \    /
topic branch   *---*---*---*---* 
3

Un modo più semplice potrebbe essere (se si dispone di più commit ammucchiati sul sistema locale):

git reset <hash tag of commit till which u need to combine> 
git commit -am "your message" // This will create one clubbed commit of all the commit till the hash tag used. 
+2

Assicurati di aggiungere nuovi file. "git commit -am" non aggiunge nuovi file da solo. –

+0

In alternativa, usando reset --soft lascerai le modifiche tutte in scena in modo da non doverti preoccupare di aggiungere file o usare -a. – PeterJCLaw

0

che non funziona per me. Io uso merge --no-ff --no-commit ma dopo impegno, ho ottenuto:

svntrunk      54f35e4 [trunk: ahead 336] release 1 

dcommitting a trunkwill impegnare tutte le 336 commit.

reset, tagging e schiacciamento come descritto nella risposta n. 2: Combine local Git commits into one commit for git-svn funzionerà, ma al prossimo "unione" si avrà qualche problema per ottenere tutti i commit di nuovo insieme!

l'unico che sta lavorando per me:

git checkout -tb svntrunk remotes/trunk 
git merge --no-commit --squash master 

per ottenere tutti i commit da maestro a svn senza perdere la storia per il futuro la fusione con lo stesso comando

~ Marcel