我正在使用git-svn
对我公司的中央Subversion存储库进行处理。我们最近在中央仓库中创建了一个新的功能分支。
我该如何告诉Git?当我运行git branch -r
时,我只能看到针对Subversion存储库运行fetch
以初始化我的Git存储库时存在的分支?
您可以手动添加远程分支,
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
如果要跟踪所有远程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 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
并对其进行编辑,以包含newbranch
上),它对应于当前指向的旧提交。 (或者使用git-update-ref refs/remotes/newbranch <new-SHA>
。谢谢inger。)下次git svn dcommit
到newbranch
时,会收到一堆有关更新某些日志的消息。我认为这很正常。gitk --all
始终处于打开状态,并经常刷新以跟踪您的工作。我还是git和git svn的新手,所以请提出对此方法的改进建议。如果您在SVN中使用标准布局,并已执行了通常的svn init,则git-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:创建跟踪远程分支的新本地分支:检出文件:100%(413/413),已完成。分支git-newbranch设置为跟踪本地ref refs / remotes / newbranch。切换到新的分支“ git-newbranch”#
git checkout -b git-newbranch -t newbranch
假设您的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
必须将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 documentation以获取更多详细信息。
这仅仅是在.git/info/grafts
中添加带有哈希的行的一种情况:
<initial branch commit> <parent commit in trunk>
例如
378b0ae0902f5c2d2ba230c429a47698810532e5 6c7144991381ce347d4e563e9912465700be0638
贷给http://evan-tech.livejournal.com/255341.html((我会将其添加为评论,但我的信誉不够。)
这是我的工作:
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
然后您将自动切换到您的分支。