git svn dcommit如何确定提交的位置?

9

我正在使用git-svn追踪同一个svn仓库中的多个分支。通常情况下,这样做都很好用,但今天我进行了一些重置(resets)和变基(rebases),突然间我的分支不能再正确地提交到远程分支了:

$ 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/a目录而不是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 如何确定要提交到哪个目录?我该如何修改这个目录?
谢谢,
乔纳斯

https://dev59.com/iUnSa4cB1Zd3GeqPKQVd - cmcginty
3个回答

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

此外,如果从多个SVN仓库合并分支进行Git合并,则dcommit将(逻辑上,但对初次使用者来说很困惑)针对第一个合并提交父级的SVN URL。 Git文档指出,“git svn dcommit将尝试在git log --grep=^git-svn-id: --first-parent -1中命名的SVN提交之上提交”。

如果重新基于另一个SVN分支,则意味着“最新”的提交(从属分支)将成为dcommit的目标。通常,用户希望针对主导SVN仓库(分支)。这需要用户在rebase时使用--no-ff选项,以确保最后一个提交指向主导分支(新选择的提交)。

其他相关的StackOverflow问题包括:


谢谢,这确实是有价值的信息! 我还发现,如果git认为分支X基于分支R,它将把分支X提交到远程分支R。因此,通过在R上对X进行变基,我可以强制git提交到正确的远程分支。 - Jonas Wagner

0

我在使用 SVN Git 时遇到了类似的问题。我的分支结构是层次化的,像这样:

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

我最初按照 git-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

我接着检出了branches/Android/dev-shared分支,对其进行了更改并将其提交到了我的本地git分支。然后我尝试了"git svn dcommit -n",以查看它在不实际提交的情况下会做什么。

我发现它正在尝试将我的分支提交到svn主干上。

非常高兴我使用了"-n"选项,避免了提交到错误的位置。

经过大量研究,我找到的最好的资源是:

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

它提出的解决方案是首先使用以下命令从svn检出一个新的克隆:
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"。


0

它确定从您已经检出的提交中可以到达哪个SVN分支(仅跟随第一个父级),并提交到该分支。由于git-svn不会在其他分支之上创建分支,因此永远不可能存在多个分支。

您可以通过在dcommit之前将本地分支变基,使其成为要在其上提交的SVN提交的后代(即要提交到的SVN分支的头部)来修改它。

来自https://git-scm.com/docs/git-svn

git svn dcommit will attempt to commit on top of the SVN commit named in

git log --grep=^git-svn-id: --first-parent -1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接