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

时间:2010-08-31 13:42:32

标签: svn git branch

我正在使用git-svn来跟踪同一个svn存储库中的多个分支。通常情况下这很好,但是今天我已经完成了一些重置和重新设置,突然我的分支机构不会再向正确的远程分支机构发送命令了:

$ 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将提交到分支/目录而不是分支/ 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如何确定要提交的目录?我该如何修改这个目录?

谢谢,
纳斯

3 个答案:

答案 0 :(得分: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/*

默认情况下,假设分支与name-to-name匹配。要跟踪不匹配的分支名称,请重命名本地分支或为奇怪命名的分支添加显式配置(远程):

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

此外,如果执行来自多个SVN repos的分支的Git合并,dcommit将(逻辑上,但对第一次用户感到困惑)将目标指定第一个合并提交父级的SVN URL。 Git文档声明“git svn dcommit将尝试在git log --grep=^git-svn-id: --first-parent -1中命名的SVN提交之上提交”

如果将一个SVN分支重新绑定到另一个SVN分支,这意味着“最新”提交(从属分支)将成为dcommit的目标。通常,用户想要定位主导SVN仓库(分支)。这要求用户在重新定位时使用--no-ff选项,以确保最后一次提交指向主导分支(新挑选的新提交)。

其他相关的StackOverflow问题包括:

答案 1 :(得分: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分支。然后我尝试了#34; 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"。

答案 2 :(得分:0)

它确定从您检出的提交中可以访问哪个SVN分支(仅在第一个父对象之后),然后提交到该分支。由于git-svn不会在其他分支之上创建分支,因此永远不能超过一个。

您可以通过在提交前重新设置本地分支的基础来对其进行修改,以使其成为您要在其之上提交的SVN提交的后代(即,您要提交的SVN分支的头部)。

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

git svn dcommit将尝试在

中命名的SVN提交之上进行提交
git log --grep=^git-svn-id: --first-parent -1