当前位置:  开发笔记 > 编程语言 > 正文

如何告诉git-svn我获取回购后创建的远程分支?

如何解决《如何告诉git-svn我获取回购后创建的远程分支?》经验,为你挑选了6个好方法。

我正在使用git-svn我公司的中央git branch -r存储库.我们最近在中央仓库中创建了一个新功能分支.我怎么fetch说呢?当我跑步时,git-svn我只能看到当我git branch -rfetch仓库对抗以初始化我的git-svn仓库时存在的分支?



1> vjangus..:

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

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]
git checkout -b local-newbranch -t newbranch
git svn rebase newbranch


@phpguru尝试删除-t选项标志,使其成为'git checkout -b local-newbranch newbranch'不要忘记将远程的前缀包含在newbranch中(例如origin/newbranch).
我变得"致命:无法设置跟踪信息; 起点'newbranch'不是git结账步骤的分支.
如果我可以八次投票,我愿意.最后,添加一个在非标准位置添加的svn分支的方法!
只需将此链接添加到文档作为参考http://www.kernel.org/pub/software/scm/git/docs/git-svn.html

2> Stop ongoing..:

如果要跟踪所有远程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.

如果你只想获取特定的分支而不是ALL,那么有一个很好的例子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远程分支.


这应该是被接受的答案!@janos,你刚刚为我节省了几个小时的头痛!如果你来印度,我会带你去喝啤酒!
编辑```.git/svn/.metadata```非常有帮助!我在```.git/config```中添加了额外的分支,```git svn fetch```没有接收 - 因为元数据修订版号"太远了".在一种情况下,仅提取分支的最后一次提交.我手动摆脱了错误的分支(重命名```.git/svn/refs/remotes/svn/qa/XYZ```到```.git/svn/refs/remotes/svn/qa/XYZ~` ``,在``..``.git/packed-refs```等中删除它... ...为元数据挑选了一个"早期"的修订号...最后运行```git svn fetch```获得完整的历史记录w /正确的连接图.

3> Hank Gay..:

看来我只需要git svn fetch; 不知怎的,我已经说服自己将获取整个回购而不仅仅是改变.


@mitjak为什么它不是正确答案,如果它是解决方案?我不明白回应的微妙之处.
在克隆之后创建分支时,它工作正常,我一直这样做.

4> MatrixFrog..:

也许我以某种方式弄乱了它,但我按照vjangus的回答中的指示,它几乎奏效了.唯一的问题是newbranch似乎没有从行李箱分支.在gitk中,它本身就是一种"浮动"; 它与躯干没有共同的祖先.

解决方法是:

    在创建分支之前,查找在主干上发生的最后一次提交的SHA1.

    找到新分支上第一次提交的SHA1(消息可能是"创建新分支,从trunk @ 12345复制"或其他内容)

    git diff-tree - 应该没有输出.如果有输出,则可能选择了错误的提交.

    git checkout local-newbranch然后git rebase .这将重新绑定local-newbranch到新树上,但remotes/newbranch仍将断开连接.

    转到该文件.git/refs/remotes/newbranch并对其进行编辑以包含提交的完整SHA1 (在重新设置上newbranch),该SHA1 对应于它当前指向的旧提交.(或者也许可以使用git-update-ref refs/remotes/newbranch .谢谢你.)

    下次你git svn dcommitnewbranch,你会得到一堆关于它的消息更新一些日志.我认为这是正常的.

我建议保持gitk --all打开时间并经常刷新以跟踪你正在做的事情.我仍然是git和git svn的新手,所以请建议改进​​这种方法.


谢谢,这听起来很有用.大约5.可能'git-update-ref refs/remotes/newbranch '是更安全的选择.

5> Gil Hamilton..:

vjangus答案的简化:

如果你在SVN中使用标准布局并且已经完成了通常的svn init,那么git-svn会为你做配置.只是:

    在SVN中查找分支副本修订版

    使用git-svn获取该修订版

    创建新的本地分支跟踪远程

一个例子.SVN网址是svn+ssh://gil@svn.myplace.com/repo.我正在寻找的SVN分支是newbranch.本地git分支(跟踪远程newbranch)将是git-newbranch.

第1步:找到分支副本修订版

    # svn log --stop-on-copy svn+ssh://gil@svn.myplace.com/repo/branches/newbranch | tail -4
    r7802 | someone | 2014-03-21 18:54:58 +0000 (Fri, 21 Mar 2014) | 1 line

    branching HEAD to newbranch
    ------------------------------------------------------------------------

因此SVN中的分支点是修订版7802.

第2步:获取修订版

    # git svn fetch -r 7802
    Found possible branch point: svn+ssh://gil@svn.myplace.com/repo/trunk => svn+ssh://gil@svn.myplace.com/repo/branches/newbranch, 7801
    Found branch parent: (refs/remotes/trunk) 8dcf3c5793ff1a8a79dc94d268c91c2bf388894a
    Following parent with do_switch
    Successfully followed parent
    r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e (refs/remotes/newbranch)

git-svn做了所有的工作,现在知道了遥控器:

    # git show-ref | grep newbranch
    2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c refs/remotes/newbranch

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

    # git checkout -b git-newbranch -t newbranch
    Checking out files: 100% (413/413), done.
    Branch git-newbranch set up to track local ref refs/remotes/newbranch.
    Switched to a new branch 'git-newbranch'



6> Mikael Lepis..:

我没有找到任何关于此功能的文档,但看起来git svn配置支持多个获取条目.这样,您还可以单独添加分支,而无需在配置中添加另一个远程svn存储库条目,也不需要使用通配符来获取某个目录的所有分支.

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

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

而你只是想亲自挑选一些要包含在你的git存储库中的分支.

您可以首先使用trunk而不使用任何其他分支来初始化您的存储库:

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

[编辑]有时似乎有必要使用--all参数运行fetch来获取新添加的分支:

git svn fetch --all -r 10000:HEAD

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有