我正在使用git-svn
我公司的中央git branch -r
存储库.我们最近在中央仓库中创建了一个新功能分支.我怎么fetch
说呢?当我跑步时,git-svn
我只能看到当我git branch -r
与fetch
仓库对抗以初始化我的git-svn
仓库时存在的分支?
您可以手动添加远程分支,
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
如果要跟踪所有远程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
.
如果你只想获取特定的分支而不是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-maxRev
或tags-maxRev
创建任何新指定的分支或标签之前的修订版.完成此操作后,运行git svn fetch
以跟踪新的svn远程分支.
看来我只需要git svn fetch
; 不知怎的,我已经说服自己将获取整个回购而不仅仅是改变.
也许我以某种方式弄乱了它,但我按照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 dcommit
来newbranch
,你会得到一堆关于它的消息更新一些日志.我认为这是正常的.
我建议保持gitk --all
打开时间并经常刷新以跟踪你正在做的事情.我仍然是git和git svn的新手,所以请建议改进这种方法.
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'
我没有找到任何关于此功能的文档,但看起来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