2010-08-31 15 views
9

Sto usando git-svn per tracciare più rami nello stesso repository svn. Di solito questo funziona bene, ma oggi ho fatto qualche reset e rebases, e improvvisamente i miei rami non dcommit al ramo remota destra più:in che modo git svn dcommit determina dove eseguire il commit?

$ git branch 
* master 
    a 
    b 

$ git svn dcommit -n 
Committing to svn://server/repo/trunk ... 

$ git checkout a 
$ git svn dcommit -n 
Committing to svn://server/repo/branches/a ... 

$ git checkout b 
$ git svn dcommit -n 
Committing to svn://server/repo/branches/a ... 

Così il ramo B sarebbe impegnarsi per i rami/una directory invece della directory branches/b.

Ho provato a cambiare il ramo che viene monitorato:

$ git branch --set-upstream b remotes/b 

e altre cose, ma l'unica soluzione che ha funzionato è stato quello di eliminare il ramo B e ricrearlo:

$ git branch -D b 
$ git branch b remotes/b 
$ git svn dcommit -n 
Committing to svn://server/repo/branches/b ... 

Ora la mia domanda è: in che modo git svn determina a quale directory impegnarsi? E come posso modificare questa directory?

Grazie,
Jonas

+0

http://stackoverflow.com/questions/1319319/git-svn-isnt-committing-to-branches-only-trunk – cmcginty

+1

Accetta una risposta –

risposta

5

La configurazione SVN che stai cercando è nel file .git/config del repository clonato. Può essere manipolato con un editor di testo. Ecco un esempio:

$ cat .git/config   
[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
    ignorecase = true 
[svn-remote "svn"] 
    url = https://pdfsam.svn.sourceforge.net/svnroot/pdfsam 
    fetch = trunk:refs/remotes/trunk 
    branches = branches/*:refs/remotes/* 
    tags = tags/*:refs/remotes/tags/* 

Si presuppone che i rami corrispondano nome-a-nome per impostazione predefinita. Per tenere traccia di un nome del ramo non corrispondenti, rinominare la sezione locale o aggiungere una configurazione esplicita (remoto) per il ramo strano nome:

[svn-remote "weirdbranch"] 
    url = svn+ssh://ambientideas.com/svnrepos/myproject/branches/myweirdbranch 
    fetch = :refs/remotes/git-svn-myweirdbranchlocalname 

Inoltre, se si esegue Git fonde di rami da più pronti contro termine SVN, la dcommit sarà (logicamente, ma confondendo gli utenti per la prima volta) come target dell'URL SVN del primo genitore di commit di merge. La documentazione di Git afferma "git svn dcommit tenterà di eseguire il commit del commit SVN denominato in git log --grep=^git-svn-id: --first-parent -1"

Se si ribasda un ramo SVN rispetto a un altro, ciò significa che il commit "più recente" (il ramo subordinato) sarà il obiettivo dello dcommit. Spesso, l'utente vuole indirizzare il repository SVN dominante (ramo). Ciò richiede all'utente di utilizzare l'opzione --no-ff durante la reimpostazione per garantire gli ultimi punti di commit al ramo dominante (nuovi commit selezionati).

Altre questioni rilevanti StackOverflow includono:

+0

Grazie, è davvero un'informazione preziosa! Ho anche scoperto che git commetterà un ramo X al ramo remoto R se pensa che X sia basato su R. Quindi, rebasando X su R, potrei forzare git a commettere sul ramo remoto giusto. –

0

Il mio problema con svn git era simile.La mia struttura ramo era gerarchica simile a questo:

svn/projectX/branches/ 
svn/projectX/branches/Android 
svn/projectX/branches/Android/dev-shared 

ho seguito le istruzioni ed esempi nel manuale git-svn:

https://www.kernel.org/pub/software/scm/git/docs/git-svn.html

e clonato il mio baule usando:

git svn clone -s --prefix=svn/ https://mw.com/svn/projectX -T trunk -t tags -b branches/Android 

I poi controllato branch/Android/dev-shared branch ha apportato le modifiche e le ha inviate al mio ramo git locale. Ho quindi provato "git svn dcommit -n" per vedere cosa avrebbe fatto senza realmente commettere.

Ho visto che stava cercando di impegnare il mio ramo che si impegna nel trunk su svn.

SO felice che ho usato l'opzione "-n" ed evitato di commettere nel posto sbagliato.

Dopo molte ricerche la miglior risorsa ho trovato è stato:

http://www.janosgyerik.com/practical-tips-for-using-git-with-large-subversion-repositories/

La soluzione ha suggerito era alla cassa prima di un nuovo clone da svn utilizzando:

git svn clone http://me.com/projectX/trunk projectX 

e quindi modificare manualmente il .git \ file di configurazione per aggiungere ulteriori voci di recupero per ciascuna delle mie filiali su cui volevo lavorare:

[svn-remote "svn"] 
    url = https://me.com/svn/projectX 
    fetch = trunk:refs/remotes/svn/trunk 
    fetch = branches/Android/dev-shared:refs/remotes/svn/branches/Android/dev-shared 

Poi quando ho ritentato "git svn dcommit -n" si stava ora impegnando sul ramo corretto "branches/Android/dev-shared".

Problemi correlati