代码之家  ›  专栏  ›  技术社区  ›  Jonas Wagner

git svn DCOMIT如何确定提交到哪里?

  •  9
  • Jonas Wagner  · 技术社区  · 16 年前

    我正在使用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将提交到Branchs/a目录,而不是Branchs/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如何确定提交到哪个目录?我如何修改这个目录?


    乔纳斯

    2 回复  |  直到 16 年前
        1
  •  5
  •   Community Mohan Dere    9 年前

    您正在查找的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
    

    dcommit 将(逻辑上,但会让第一次使用的用户感到困惑)以第一个合并提交父级的SVN URL为目标。Git文档声明“Git svn dcommit将尝试在中命名的svn提交之上进行提交 git log --grep=^git-svn-id: --first-parent -1 "

    如果将一个SVN分支与另一个SVN分支重定基址,这意味着“最新”提交(从属分支)将成为 . 通常,用户希望以主导的SVN回购(分支)为目标。这要求用户使用 --no-ff

    其他相关问题包括:

        2
  •  0
  •   Farrukh Najmi    12 年前

    我与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
    

    然后我签出了branchs/Android/dev共享分支所做的更改,并将它们提交给我的本地git分支。然后我尝试了“gitsvndcommit-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
    

        3
  •  0
  •   Karu aerobrain    6 年前

    它确定可以通过签出的提交(仅在第一个父级之后)访问哪个SVN分支,并提交到该分支。因为git svn不会在其他分支之上创建分支,所以不能有多个分支。

    从…起 https://git-scm.com/docs/git-svn :

    git svn dcommit 将尝试在中命名的SVN提交之上提交

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