git-svn-rebase正在提交给SVN标记

时间:2010-07-21 13:20:28

标签: git git-svn

我刚开始使用git并使用它与SVN存储库进行交互。 svn repo采用标准格式,因此我将沙箱配置为

git svn clone <repo> -s

最初看起来一切都很好,但经过多次改动,dcommits和标签我似乎总是提交给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 / config是:

[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中探索并没有帮助。知道出了什么问题吗?

1 个答案:

答案 0 :(得分:2)

git svn命令有一个错误,在最初导入svn存储库时,主分支可能指向svn trunk以外的东西。它已在git v1.6.5及更高版本中修复(如果您已检出git,则在v1.6.5-rc0~75中修复)。

如果您已经完成了svn存储库的检查并希望确保master分支指向svn trunk,请执行以下操作。

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

  1. 如果您还没有使用git checkout master切换到主分支。使用git branch查看当前分支,旁边有一个带星号('*')的分支。

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

  3. 如果git svn info指向标记或分支网址,请运行git log并找到第一个提交,其中包含指向您的svn中继网址的“git-svn-id:”网址。复制代表此提交的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的最新版本。

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