2010-04-25 63 views
4

我使用git-svn进行跟踪的SVN回购最近已损坏,恢复了备份。然而,在经济复苏中,一周的承诺失败了。是否有可能在我的本地git repo上使用git-svn dcommit来恢复那些丢失的提交?运行git-svn dcommit与SVN中最后一次恢复提交的SHA1是否足够?例如。我可以使用本地跟踪git-svn分支来恢复SVN存储库中丢失的提交吗?

> 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

这是我如何实现我想要的东西:

  1. 再克隆一个全新的git - svn的回购http://tracked-svn/trunk
  2. 添加我的旧git-svn回购作为新回购的远程。 (如git remote add -f up-to-date /path/to/repo
  3. git merge remotes/up-to-date/master
  4. git svn dcommit

衍合上我的老回购给任何错误,并如预期dcommit工作。

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

1

不是一个完整的答案,但that thread可以解释有点错误消息:

git svn dcommit”有一个可选的版本参数,但它的意义是相当可怕的。
它完全忽略了HEAD的当前状态,仅查看SVN和$rev之间的修订版。
如果HEAD被附加到$ branch,那么该分支会丢失进程中的所有提交$ rev .. $分支。

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

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

我不知道如果补丁已经集成在版本的Git,但如果你测试你的dcommit,确保git branch -bdcommit后,用树枝来引用当前HEAD。
它可以在SVN端工作吗?我不知道。

0

我发现这篇文章是洒在detached_head situation一些轻。

我一直在这里处理或多或少同样的问题,这是我落得这样做:

  • 首先,始终确保你在一个有效的分支git branch
  • 如果您看到(no branch)(W /星号表示“当前分支”),这意味着你有一个分离的头
  • 结帐分离的头git co -b [BRANCH NAME] --track。使用--track选项,我觉得使得跟踪git-svn HEAD,因此reattachs这个新分支的HEAD。
  • 继续与往常一样git svn rebase/dcommit命令。

这可能是不好的,但是这也似乎帮助 - 我删除了master分支,然后做一个git svn rebase后,它似乎自动添加回到master分支。

而且,我看一个文件的日志,它看来,一旦我做了git svn dcommit,所有的git签入来自当我的分支开始快要疯了完整,我试图尽我所能,把它重新设置正确。

我不是100%肯定这是完全正确的,但我这似乎为我工作。