我如何告知git-svn有关在获取存储库后创建的远程分支的信息?

问题描述 投票:190回答:9

我正在使用git-svn对我公司的中央Subversion存储库进行处理。我们最近在中央仓库中创建了一个新的功能分支。

我该如何告诉Git?当我运行git branch -r时,我只能看到针对Subversion存储库运行fetch以初始化我的Git存储库时存在的分支?

git git-svn
9个回答
289
投票

您可以手动添加远程分支,

git config --add svn-remote.newbranch.url https://svn/path_to_newbranch/
git config --add svn-remote.newbranch.fetch :refs/remotes/newbranch
git svn fetch newbranch [-r<rev>]
git checkout -b local-newbranch -t newbranch
git svn rebase newbranch

92
投票

如果要跟踪所有远程svn分支,则解决方案很简单:

git svn fetch

这将获取所有尚未获取的所有远程分支。

[额外提示:如果您最初仅签出中继,之后又要跟踪所有分支,则编辑.git/config看起来像这样,然后重新运行git svn fetch

[svn-remote "svn"]
        url = https://svn/path_to_repo_root/
        fetch = path_to_trunk:refs/remotes/git-svn
        branches = path_to_branches/*:refs/remotes/*

关键点是url应指向存储库根目录,并且fetchbranches中定义的路径应相对于url

如果只想获取特定分支而不是全部,则在git svn --help中有一个很好的例子:

[svn-remote "huge-project"]
        url = http://server.org/svn
        fetch = trunk/src:refs/remotes/trunk
        branches = branches/{red,green}/src:refs/remotes/branches/*
        tags = tags/{1.0,2.0}/src:refs/remotes/tags/*

使用旧版本的git-svn,一旦指定了这样的分支,就可能无法使用git svn fetch获得新的分支。一种解决方法是添加更多fetch行,如下所示:

[svn-remote "huge-project"]
        url = http://server.org/svn
        fetch = trunk/src:refs/remotes/trunk
        fetch = branches/blue:refs/remotes/branches/blue
        fetch = branches/yellow:refs/remotes/branches/yellow
        branches = branches/{red,green}/src:refs/remotes/branches/*

@ AndyEstes的另一种解决方法:在创建任何新指定的分支或标记之前,编辑.git/svn/.metadata并将branches-maxRevtags-maxRev的值更改为修订版。完成此操作后,运行git svn fetch跟踪新的svn远程分支。


53
投票

看来我只需要git svn fetch;我以某种方式说服了自己,这将获取整个回购而不只是更改。


15
投票

也许我以某种方式弄乱了它,但是我按照vjangus的回答中的说明进行操作,[[几乎起作用了。唯一的问题是newbranch似乎不是从主干分支出来的。在gitk中,它本身就是一种“浮动”。它与树干没有共同的祖先。

解决方案是:

    查找创建分支之前在主干上发生的最后一次提交的SHA1。
  1. 在新分支上找到第一次提交的SHA1(消息可能是“已创建新分支,从trunk @ 12345复制”)
  2. git diff-tree <sha1 from step 1> <sha1 from step 2>-应该没有输出。如果输出,则您可能选择了错误的提交。
  3. [git checkout local-newbranch然后是git rebase <sha1 from step 1>。这会将local-newbranch重新建立到新树上,但remotes/newbranch仍将断开连接。
  4. 转到文件.git/refs/remotes/newbranch并对其进行编辑,以包含
  5. new
提交的完整SHA1(在重新设置的newbranch上),它对应于当前指向的旧提交。 (或者使用git-update-ref refs/remotes/newbranch <new-SHA>。谢谢inger。)下次git svn dcommitnewbranch时,会收到一堆有关更新某些日志的消息。我认为这很正常。
  • 我建议保持gitk --all始终处于打开状态,并经常刷新以跟踪您的工作。我还是git和git svn的新手,所以请提出对此方法的改进建议。

  • 7
    投票
    简化了简答的答案:

    如果您在SVN中使用标准布局,并已执行了通常的svn init,则git-svn将为您完成配置工作。只是:

      在SVN中查找分支副本修订版
    1. 使用git-svn获取该修订版
    2. 创建新的本地分支跟踪遥控器
  • 一个例子。 SVN网址为svn+ssh://[email protected]/repo。我正在寻找的SVN分支是newbranch。本地git分支(跟踪远程newbranch)将为git-newbranch

    步骤1:查找分支副本修订版

    svn log --stop-on-copy svn + ssh://[email protected]/repo/branches/newbranch |尾巴-4r7802 |某人| 2014-03-21 18:54:58 +0000(2014年3月21日,星期五)| 1线将HEAD分支到newbranch-------------------------------------------------- ----------------------
    所以SVN中的分支点是7802版。

    步骤2:获取修订版本

    git svn fetch -r 7802
    找到可能的分支点:svn + ssh://[email protected]/repo/trunk => svn + ssh://[email protected]/repo/branches/newbranch,7801找到分支父级:(refs / remotes / trunk)8dcf3c5793ff1a8a79dc94d268c91c2bf388894a用do_switch跟随父对象成功跟随父母r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e(引用/远程处理/新分支)git-svn完成了所有工作,现在知道了遥控器:

    #git show-ref | grep newbranch2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c参考/远程/新分支

    步骤3:创建跟踪远程分支的新本地分支:

    git checkout -b git-newbranch -t newbranch
    检出文件:100%(413/413),已完成。分支git-newbranch设置为跟踪本地ref refs / remotes / newbranch。切换到新的分支“ git-newbranch”

  • 5
    投票
    我尚未找到有关此功能的任何文档,但看起来git svn配置支持多个提取条目。这样,您还可以单独添加分支,而无需在配置中添加另一个远程svn存储库条目,也无需使用通配符来获取特定目录的所有分支。

    假设您的SVN树真的很讨厌,有很多分支,而没有任何逻辑如何定位它们,例如具有包含更多分支的分支和子目录。

    trunk branches -> branch1 -> sub-dir1 -> branch2 -> branch3 -> sub-dir2 -> branch4 -> sub-dir3 -> branchX <... hundreds more ...>

    而且您只想手工选择要包含在git存储库中的一些分支。

    您可以首先仅使用主干来初始化存储库,而无需任何其他分支:

    git svn clone -r 10000:HEAD https://svn.com/MyRepo myrepo --prefix=svn/ --trunk=trunk

    之后,您应该看到以下配置:

    localhost: elhigu$ git config --get-regexp "svn-remote." svn-remote.svn.url https://svn.com/MyRepo svn-remote.svn.fetch trunk:refs/remotes/svn/trunk

    当您想从MyRepo获取新分支时,只需通过以下方式将新的获取条目添加到配置中:

    git config --add svn-remote.svn.fetch branches/sub-dir2/branch4:refs/remotes/svn/branches/sub-dir2/branch4

    或者您可以在.git / config中编辑相同的配置

    要在将新分支添加到配置后获取新分支,只需运行:

    git svn fetch -r 10000:HEAD

    [[Edit]有时似乎需要使用--all参数运行fetch以获取新添加的分支:

    git svn fetch --all -r 10000:HEAD

    4
    投票
    代替处理git-svn的怪癖,您可以尝试SubGit

    必须将SubGit安装到Subversion存储库中。之后,可以使用标准的git工作流程,而不是使用特殊的git-svn命令:

    1. 推动新的提交:

      git-svn:

      $ git commit $ git svn rebase $ git svn dcommit

      SubGit:

      $ git commit $ git push

    2. 获取传入的更改

      git-svn:

      $ git svn rebase

      SubGit:

      $ git pull [--rebase]

    3. 创建新分支:

      git-svn:

      $ git svn branch foo $ git checkout -b foo -t remotes/foo $ git commit $ git svn dcommit

      SubGit:

      $ git checkout -b foo $ git commit $ git push

    请参见SubGit documentation以获取更多详细信息。

    2
    投票
    [添加到vjangus的答案对我有所帮助,我还发现添加git嫁接在适当的位置将分支绑定到主干非常有用-允许git查看历史并正确执行合并。

    这仅仅是在.git/info/grafts中添加带有哈希的行的一种情况:

    <initial branch commit> <parent commit in trunk>

    例如

    378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638

    贷给http://evan-tech.livejournal.com/255341.html

    ((我会将其添加为评论,但我的信誉不够。)


    0
    投票
    如果您不签出有效的版式,将无法签出远程分支。

    这是我的工作:

    git svn init -s <svn path with no trunk> local_repo cd local_repo git svn fetch ## wait

    之后,您可以切换到远程分支:

    git checkout --track -b branch_name branch_name

    然后您将自动切换到您的分支。
    © www.soinside.com 2019 - 2024. All rights reserved.