2010-07-21 90 views
1

我刚刚开始使用git并使用它与SVN存储库进行交互。将svn的是在一个标准的格式,所以我配置我的沙箱git-svn-rebase正在使用SVN标记

git svn clone <repo> -s 

一切似乎开始罚款,但经过几次底垫,dcommits和标签我似乎总是commiting到SVN标签。做一个dcommit预演回报:

$ git svn dcommit --dry-run 
Committing to http://proj.badc.rl.ac.uk/svn/badc/users/spascoe/metaconfig/tags/0.1.1 ... 
diff-tree a1265119164b79cfb12d28a7059d453fb4eb13f7~1 a1265119164b79cfb12d28a7059d453fb4eb13f7 

我的.git /配置是:

[core] 
    repositoryformatversion = 0 
    filemode = true 
    bare = false 
    logallrefupdates = true 
    autocrlf = false 
[svn-remote "svn"] 
    url = http://proj.badc.rl.ac.uk/svn/badc 
    fetch = users/spascoe/metaconfig/trunk:refs/remotes/trunk 
    branches = users/spascoe/metaconfig/branches/*:refs/remotes/* 
    tags = users/spascoe/metaconfig/tags/*:refs/remotes/tags/* 

闲逛在git的是没有帮助。任何想法出了什么问题?

+0

究竟是什么意思,“在几个标签之后?” – lindelof 2010-07-21 13:33:51

+0

即使我重新克隆SVN仓库,我最终还是会对tags/0.1.1进行提交。 最后,我通过在SVN中进行虚拟提交来解决了这个问题,使用git进行recloning,然后将从1 git回购库中的待处理更改合并到另一个。我不回复svn主干。 我还想知道这个混乱是怎么发生的:-) – spascoe 2010-07-21 15:21:17

+0

@lindelof。说实话我不记得了。我想我尝试了“git tag”,发现它对svn没有任何帮助。然后我找到了“svn tag”,然后发现我可以使用“git svn tag”。 – spascoe 2010-07-21 15:22:41

回答

2

git svn命令有一个错误,当初始导入svn仓库时,master分支可能指向svn trunk以外的其他东西。它在git v1.6.5和更高版本中被修复(如果你有git签出,则在v1.6.5-rc0~75中)。

如果你已经完成了检查svn仓库,并且想要确保主分支指向svn trunk,请执行以下操作。

注意:这些说明假定您已提交或隐藏您所做的任何本地更改。使用git stash save保存所有未提交的作品,并使用git branch newbranchname创建一个分支到您的上次提交。

  1. 切换到使用git checkout master,如果你不是已经有主分支。使用git branch来查看您当前的分支,它旁边有一个星号('*')。

  2. 运行git svn info并检查“URL:”字段。如果URL指向主干,那么你就完成了。下一个git svn dcommit将提交到主分支的中继。

  3. 如果git svn info指向一个标签或分支URL,运行git log,并找到第一次提交的是有一个指向您的SVN主干网址为“git-svn-id:” URL。复制表示此提交的40个字符的提交散列(以“commit”开头的行)。

  4. 重置您的主分支使用git reset --hard commit-hash提交哈希取代“commit-hash”与提交哈希从第3步

    注:这一步是最危险的一个!确保你保存了所有的工作!根据需要制作工作目录的tarball。

  5. 再次运行git svn info以确保“URL:”字段显示您在中继线上。如果没有,则在步骤3中复制错误的提交散列值。转到步骤3并重试。

  6. 运行git svn rebase将您的主分支更新到您的svn存储库中trunk的最新版本。

专业提示:专家会注意到,你可以在每一个底部,解析“git-svn-id:”行提交日志,以确定是否一个特定的提交是主干,在标签上或分公司。因此,使用git log master来检查主分支上的第一次提交是否指向svn存储库的主干URL就足够了。