2010-08-31 81 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”。