2010-08-31 28 views
9

我使用git-svn來跟蹤同一svn倉庫中的多個分支。通常,這工作得很好,但今天我已經做了一些復位和底墊,突然我的樹枝不會dcommit向右遠程分支了:git svn dcommit如何確定在哪裏提交?

$ 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 ... 

所以分支B將提交到分支/目錄而不是branches/b目錄。

我試圖改變被跟蹤的分支:

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

等東西,而只是說工作的解決辦法是刪除分支B和重建它:

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

現在我的問題是:git svn如何確定要提交的目錄?我該如何修改這個目錄?

感謝,
喬納斯

+0

http://stackoverflow.com/questions/1319319/git-svn-isnt-committing-to-branches-only-trunk – cmcginty 2010-08-31 19:02:28

+1

接受答案 – 2014-02-11 20:38:37

回答

5

你正在尋找的SVN配置是您克隆庫的git的/ config文件。它可以使用文本編輯器進行操作。以下是一個示例:

$ 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/* 

默認情況下,假定分支匹配名稱與名稱。要跟蹤一個不匹配的分支名稱,可以重命名本地分支或添加一個顯式的配置(遠程)的奇怪命名分支:

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

此外,如果執行GIT中從多個SVN回購分支合流,所述dcommit將(從邏輯上講,但是讓第一次使用的用戶感到困惑)定位到第一個合併提交父代的SVN URL。 Git的文檔狀態「混帳SVN dcommit將嘗試在SVN的頂部犯git log --grep=^git-svn-id: --first-parent -1提交名爲」

如果基礎重建對另外一個SVN分支,這意味着「最新的」承諾(下屬分支)將是dcommit的目標。通常,用戶想要瞄準主要的SVN回購(分支)。這要求用戶在重新綁定時使用--no-ff選項,以確保最後一個提交點指向主要分支(新的挑選提交)。

其他相關StackOverflow的問題包括:

+0

謝謝,這確實是有價值的信息! 我也發現git會將分支X提交到遠程分支R,如果它認爲X基於R.因此,通過在R上重新分配X,我可以強制git提交到正確的遠程分支上。 – 2011-02-01 07:37:41

0

我使用svn git的問題是相似的。我的分支結構是等級制度是這樣的:

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

我第一次跟着混帳svn的手冊說明和舉例:

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

,並使用克隆我的樹幹:

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

我然後檢查出branch/Android/dev-shared分支進行了更改並將它們提交給我的本地git分支。然後我嘗試了「git svn dcommit -n」,看看它會在沒有實際提交的情況下做什麼。

我看到它試圖將我的分支提交提交給svn上的trunk。

很高興我使用了「-n」選項並避免提交到錯誤的地方。

大量的研究後,我找到了最好的資源是:

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

它建議是首先從SVN使用Google Checkout新克隆的解決方案:

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

,然後手動編輯.git \ config文件爲我想要處理的每個分支添加其他提取條目:

[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 

然後,當我重試「git svn dcommit -n」時,它現在正在提交正確的分支「branches/Android/dev-shared」。