我刚开始使用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中探索并没有帮助。知道出了什么问题吗?
答案 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
为上次提交创建分支。
如果您还没有使用git checkout master
切换到主分支。使用git branch
查看当前分支,旁边有一个带星号('*')的分支。
运行git svn info
并检查“URL:
”字段。如果URL指向trunk,那么你就完成了。下一个git svn dcommit
将从主分支提交到trunk。
如果git svn info
指向标记或分支网址,请运行git log
并找到第一个提交,其中包含指向您的svn中继网址的“git-svn-id:
”网址。复制代表此提交的40个字符的提交哈希(以“commit”开头的行)。
使用git reset --hard commit-hash
将“commit-hash
”替换为步骤3中的提交哈希,将主分支重置为提交哈希。
注意:这一步是最危险的一步!确保你已经保存了所有的工作!必要时制作工作目录的tarball。
再次运行git svn info
以确保“URL:
”字段显示您在主干上。如果没有,则在步骤3中复制了错误的提交哈希。转到步骤3并再试一次。
运行git svn rebase
将主分支更新到svn存储库中trunk的最新版本。
专家提示:专家会注意到您可以解析每个提交日志底部的“git-svn-id:
”行,以确定特定提交是在主干上,标记上还是在一个分支上。因此,使用git log master
检查主分支上的第一个提交是否指向svn存储库的主干URL就足够了。