Answers:
您可以手动添加远程分支,
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
fatal: Cannot setup tracking information; starting point 'newbranch' is not a branch.
git checkout步骤。
如果要跟踪所有远程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
应指向库根,并在限定的路径fetch
和branches
应该是相对于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-maxRev
或tags-maxRev
将其更改为修订版。完成此操作后,请运行git svn fetch
以跟踪新的svn远程分支。
.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
最终获得了完整的历史记录(带有正确的连接图)。
git svn fetch --all
。
看来我只需要git svn fetch
; 我以某种方式说服自己可以获取整个仓库,而不仅仅是更改。
也许我以某种方式弄乱了它,但是我遵循了vjangus的回答中的说明,并且几乎可以正常工作。唯一的问题是newbranch似乎不是从主干分支出来的。在gitk中,它本身就是一种“浮动”的形式。它与树干没有共同的祖先。
解决方案是:
git diff-tree <sha1 from step 1> <sha1 from step 2>
-应该没有输出。如果有输出,则可能是您选择了错误的提交。git checkout local-newbranch
然后git rebase <sha1 from step 1>
。这将local-newbranch
基于新树,但remotes/newbranch
仍将断开连接。.git/refs/remotes/newbranch
并对其进行编辑,以包含新提交的完整SHA1 (在rebased上newbranch
),该提交与当前指向的旧提交相对应。(或者使用git-update-ref refs/remotes/newbranch <new-SHA>
。谢谢inger。)git svn dcommit
来newbranch
,你会得到一堆关于它的消息更新一些日志。我认为这很正常。我建议始终保持gitk --all
开放状态,并经常刷新以跟踪您的工作。我还是git和git svn的新手,所以请提出对该方法的改进建议。
简化vjangus的答案:
如果您在SVN中使用标准布局,并且已经执行了通常的svn init,则git-svn将为您完成配置工作。只是:
一个例子。SVN网址为svn+ssh://gil@svn.myplace.com/repo
。我要寻找的SVN分支是newbranch
。本地git分支(远程跟踪newbranch
)将为git-newbranch
。
步骤1:找到分支副本修订版
#SVN登录--stop-上复制SVN + SSH://gil@svn.myplace.com/repo/branches/newbranch | 尾巴-4 r7802 | 某人| 2014-03-21 18:54:58 +0000(2014年3月21日,星期五)| 1线 将HEAD分支到newbranch -------------------------------------------------- ----------------------
因此,SVN中的分支点是版本7802。
步骤2:取得修订
#混帐SVN取-r 7802 找到可能的分支点:svn + ssh://gil@svn.myplace.com/repo/trunk => svn + ssh://gil@svn.myplace.com/repo/branches/newbranch,7801 找到分支父级:(refs / remotes / trunk)8dcf3c5793ff1a8a79dc94d268c91c2bf388894a 用do_switch跟随父对象 成功跟随父母 r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e(引用/远程处理/新分支)
git-svn完成了所有工作,现在知道了遥控器:
#git show-ref | grep newbranch 2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c参考/远程/新分支
步骤3:建立追踪远端的新本地分支:
#git的结帐-b混帐newbranch -t newbranch 检出文件:100%(413/413),已完成。 分支git-newbranch设置为跟踪本地ref / remotes / newbranch。 切换到新的分支“ git-newbranch”
show-ref
非常宝贵)!对于那些错误地引用远程分支的人,您可以将其删除(我必须这样做git branch -d newbranch
,然后强行删除中的ref dir .git/svn/refs/remotes/newbranch
),然后从步骤2(以上)重新开始。
我尚未找到有关此功能的任何文档,但看起来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
[编辑]有时似乎需要使用--all参数运行访存来访存新添加的分支:
git svn fetch --all -r 10000:HEAD
您可以尝试使用SubGit来代替git-svn怪癖。
必须将SubGit安装到Subversion存储库中。之后,可以使用标准的git工作流程,而不是使用特殊的git-svn命令:
推送新提交:
git-svn:
$ git commit
$ git svn rebase
$ git svn dcommit
SubGit:
$ git commit
$ git push
获取传入的更改
git-svn:
$ git svn rebase
SubGit:
$ git pull [--rebase]
创建一个新分支:
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文档。
为了增加对vjangus的回答(这对我有所帮助),我还发现添加git嫁接在适当的位置将分支绑定到主干非常有用-允许git查看历史记录并正确执行合并。
这只是.git/info/grafts
在哈希表中添加一行的情况:
<initial branch commit> <parent commit in trunk>
例如。
378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638
归功于http://evan-tech.livejournal.com/255341.html
(我将其添加为评论,但我的信誉不够。)