我可以使用本地跟踪git-svn分支恢复SVN存储库中丢失的提交吗?

时间:2010-04-25 21:36:00

标签: svn git git-svn

SVN repo我使用git-svn跟踪最近被破坏并恢复了备份。然而,在复苏中失去了一周的承诺。是否有可能在我当地的git repo上使用git-svn dcommit恢复那些丢失的提交?使用SVN中上次恢复的提交的SHA1运行git-svn dcommit是否足够?例如

> svn info http://tracked-svn/trunk | sed -n "s/Revision: //p"
252
> git log --grep="git-svn-id:.*@252" --format=oneline | cut -f1 -d" "
55bb5c9cbb5fe11a90ec2e9e1e0c7c502908cf9a
> git svn dcommit 55bb5c9cbb5fe11a90ec2e9e1e0c7c502908cf9a

或者git-svn-id是否需要从预期的提交中删除?

我使用--dry-run尝试了此操作,但无法判断是否会尝试提交所有提交:

> git svn dcommit --verbose --dry-run 55bb5c9cbb5fe11a90ec2e9e1e0c7c502908cf9a
Committing to http://tracked-svn/trunk ...
dcommitted on a detached HEAD because you gave a revision argument.
The rewritten commit is: 55bb5c9cbb5fe11a90ec2e9e1e0c7c502908cf9a

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

以下是我实现我想要的方式:

  1. 在新的git-svn repo中重新克隆http://tracked-svn/trunk
  2. 将我的旧git-svn repo添加为新鲜仓库的遥控器。 (例如git remote add -f up-to-date /path/to/repo
  3. git merge remotes/up-to-date/master
  4. git svn dcommit
  5. 根据我的旧回购重新发布没有错误,并且dcommit按预期工作。

    这可能不是恢复提交的最佳方式,但它让我得到了我想要的东西。

答案 1 :(得分:1)

不是一个完整的答案,但that thread可能会解释一下错误信息:

  

'git svn dcommit'采用可选的修订版本参数,但它的含义相当可怕   它完全忽略了HEAD的当前状态,仅查看SVN与$rev之间的修订。
  如果HEAD附加到$ branch,则该分支在此过程中丢失所有提交$ rev .. $ branch。

     

考虑到'git svn dcommit HEAD^'具有直观含义“dcommit我的分支上除了最后一个之外的所有更改”,我们更改了修订参数的含义。
  git-svn暂时检查$rev的工作,这意味着:

     
      
  • 如果指定了分支,则该分支( HEAD)作为dcommit的一部分进行重新定位,
  •   
  • 如果指定了其他修订版本,如示例所示,所有工作都在分离的HEAD上进行,并且没有分支受到影响。
  •   

我不确定该补丁是否已集成在Git版本中,但如果您测试了dcommit,请确保git branch -b之后的dcommit,以引用当前的HEAD分支。<登记/> 它会在SVN端工作吗?我不知道。

答案 2 :(得分:0)

我发现这篇文章揭示了detached_head situation

我在这里处理的问题大致相同,这就是我最终要做的事情:

  • 首先,请务必确保您使用的是有效的分支git branch
  • 如果您看到(no branch)(带星号表示“当前分支”),则表示您有一个分离头
  • 签出分离的头git co -b [BRANCH NAME] --track。使用--track选项 I THINK 使其跟踪git-svn HEAD,从而将此新分支重新附加到HEAD。
  • 按常规继续git svn rebase/dcommit个命令。

这可能很糟糕,但这似乎也有帮助 - 我删除了master分支,然后在执行git svn rebase后,它似乎自动添加回master分支。

另外,我查看了一个文件的日志,似乎一旦我做了一个git svn dcommit,所有的git签到都是完整的,从我的分支开始变得疯狂时我想尽我所能它正确地回放了。

我不是100%确定这是完全正确的,但我似乎对我有用。