如何在SVN到Git迁移后列出和获取远程分支?

时间:2010-10-25 07:32:48

标签: svn git migration branch git-svn

我将SVN存储库迁移到Git并将其推送到中央存储库。我们有相当数量的标签和分支,但不知何故,我们无法列出并从Git客户端获取它们。这很奇怪,因为标签和分支似乎在服务器上可用。

Jon Maddox blog postblog post from Marc LiyanageSO answer from Casey的帮助下,我能够将解决方案拼接在一起。谢谢你的帮助!

这就是我最终做的事情。首先,我使用svn committers创建了一个文件:

local$ svn log svn://server/opt/svn/our_app |grep ^r[0-9] | cut -f2 -d\| |sort |uniq | tee ~/users.txt
alice
bob
eve
local$ vim ~/users.txt
local$ cat ~/users.txt
alice = Alice Malice <alice@malice.doh> 
bob = Bob Hope <bob@hope.doh>
eve = Eve Leave <eve@leave.doh>

然后我从我们的svn repo创建了一个git repo:

local$ mkdir our_app
local$ cd our_app
local$ git svn init --stdlayout svn://server/opt/svn/our_app 
local$ git config svn.authorsfile ~/users.txt
local$ git svn fetch
local$ git svn create-ignore
local$ git commit -m 'added .gitignore, created from svn:ignore'
local$ for remote in `git branch -r`; do git checkout -b $remote $remote; done  

最后一步至关重要,因为从远程存储库克隆时,分支/标记不可用。无论如何,我把它推到了一个新的远程仓库:

local$ ssh server
server$ mkdir /opt/git/our_app.git
server$ cd /opt/git/our_app.git
server$ git --bare init
server$ git config core.sharedrepository 1
server$ git config receive.denyNonFastforwards true
server$ find objects -type d -exec chmod 02770 {} \;
server$ exit
local$ git remote add origin ssh://server/opt/git/our_app.git
local$ git push --mirror

远程存储库的新克隆显示一切都可用:

local$ git clone ssh://server/opt/git/our_app.git
local$ cd our_app
local$ git branch -a
* master
  remotes/origin/master
  remotes/origin/pre-svn-move
  remotes/origin/tags/mytag-0.1
  remotes/origin/tags/mytag-0.2
  remotes/origin/trunk
  remotes/origin/mybranch-1
  remotes/origin/mybranch-2

现在可以检出远程分支:

local$ git checkout -t origin/mybranch-1
local$ git branch
  master
* mybranch-1

重新迭代:本指南包括远程标记和分支可用性的提示,镜像到远程仓库以及重复使用svn:ignore中的值。我之前没有在一本指南中找到所有这些内容。

最后一点:ebneter's tip about svn2git也很棒,因为这个实际上将标签保留为标签,而git-svn将它们转换为分支。另一方面,我无法使用“git svn create-ignore”来使用svn2git ......

2 个答案:

答案 0 :(得分:1)

如果这是一个单向转换(永远不会回到svn),我强烈建议使用svn2git,因为它大大简化了整个过程。要进行转换,基本上就是

svn2git <svn repo url> --authors <author names & emails file>
git remote add origin <git bare repo url>
git push --all
git push --tags

......真的就是这一切。

答案 1 :(得分:0)

我能在序列中找到的唯一可疑命令是

git config branch.master.remote origin

首先,你的第一个本地仓库(来自git svn fetch)应该有分支,而不是远程分支。

其次,您的服务器仓库(具有正确的分支)应该能够克隆其所有refs,这意味着第二个本地仓库应该列出所有远程分支。

您可以在没有git svn fetch的情况下试用git config branch.master.remote origin吗?