2015-11-25 25 views
5

ho la seguente situazione con il mio monte svn repository:GIT SVN: andare a prendere un ramo SVN ricreato senza la sbagliata merge genitore

ho creato un ramo svn e ha fatto un lavoro su di esso che ha portato a una storia davvero contorto. Così l'ho cancellato di nuovo, mantenendo il commit git, che mi ha permesso di ripulire la storia abbastanza bene.

Una volta pronta la serie di patch, ho riavviato il ramo utilizzando svn copy, seguito da un git svn fetch. L'idea era, che avrei quindi rebase la cronologia ripulita sul nuovo ramo svn, in modo che potessi facilmente pubblicarlo con git svn dcommit.

Tuttavia, git svn fetch non ha fatto ciò che mi aspettavo. Questo è quello che mi aspettavo (finto git log --oneline --decorate --graph uscita):

* xxxxxxx (svn-branch) 
* xxxxxxx (svn-parent-branch) 
... 
somewhere further down, unrelated to the above 
* xxxxxxx (old-svn-branch-head) 

Ma questo è quello che ho ottenuto:

* xxxxxxx (svn-branch) 
|\ 
| * xxxxxxx (svn-parent-branch) 
| 
* xxxxxxx (old-svn-branch-head) 

Come si vede, git svn fetch completamente ignorato il fatto che il ramo svn stato eliminato, la mappatura del ricreare svn commit a un merge commit in git. Ora, non mi preoccuperei di questo, se questo fosse privo di conseguenze, ma sfortunatamente, la connessione sbagliata confonde gli algoritmi di unione di git, creando conflitti di unione falsi durante la ridefinizione attraverso il nuovo commit di diramazione.

Quindi la mia domanda è: come posso invogliare git svn fetch di non collegare la nuova base ramo impegnarsi con il genitore sbagliato, o in qualche modo risolvere il mio git repo in un modo che ritengo la possibilità di pubblicare le mie cose con git svn dcommit? Naturalmente, posso sempre cancellare di nuovo l'intera cosa e creare un nuovo ramo svn con un nome diverso, ma mi chiedevo se esiste una soluzione migliore.

+0

Qual è lo stato del 'svn-branch'? È secondo le tue aspettative? Quindi non vedo perché non puoi semplicemente eseguire una rebase dei tuoi commit git-ed in cima al 'svn-branch'. Vedi la cronologia completa quando dici 'git rebase -i --onto svn-branch '? –

+0

@MykolaGurov Il ramo 'svn' è ok. Ho cancellato il vecchio stato con 'svn rm', quindi ho ricreato il ramo con' svn copy'. Entrambi erano operazioni 'svn', ed entrambi mostrano esattamente il risultato atteso. Inoltre, proprio come previsto, 'git diff svn-parent-branch svn-branch' non produce output. Tuttavia, ottengo conflitti di unione quando si passa da 'svn-parent-branch' a' svn-branch' a causa delle connessioni fasulle tramite 'old-svn-branch-head'; la strategia di unione ricorsiva sembra calcolare una base di unione errata basata su connessioni errate (è un progetto molto attivo). So che è una situazione abbastanza particolare :-( – cmaster

+0

Forse mi manca qualcosa, ma puoi definire esplicitamente tutti i punti per rebase, come ho provato a dimostrare.Quindi dato che 'svn-parent-branch' non discende da' old-svn-branch-head' e nessuno dei tuoi commit da rebase, non mi aspetterei alcun problema. Ma allora sì, puoi sempre creare un nuovo ramo con un nome diverso ed evitare questo problema. git-svn si inceppa nella cronologia di svn non continua. –

risposta

2

Ho riscontrato una situazione simile e ancora non sono riuscito a trovare un modo per disattivare questo comportamento (--no-follow-parent disattiva l'intero rilevamento del ramo, che non è quello che voglio).

Ho finito per registrare la cronologia con git replace --graft. Crea un commit di sostituzione e keeps its children unchanged. Dopo la sostituzione (Es. git replace --graft svn-branch svn-parent-branch) questo è quello che si vede:

* svn-branch 
| 
* svn-parent-branch 
... 
* old-svn-branch-head 

È ancora possibile vedere l'originale commit con gitk --all opzione.

* svn-branch (replacement) 
| 
| * svn-branch (original) 
|/| 
* | svn-parent-branch 
| | 
| * old-svn-branch-head 
... 
+0

Wow, non sapevo ancora "git replace", ancora. Sembra piuttosto un trucco, se me lo chiedi 8-) Tuttavia, sembra essere una soluzione utilizzabile per il problema in questione. – cmaster