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
感谢您的帮助。
答案 0 :(得分:3)
以下是我实现我想要的方式:
http://tracked-svn/trunk
。git remote add -f up-to-date /path/to/repo
)git merge remotes/up-to-date/master
git svn dcommit
根据我的旧回购重新发布没有错误,并且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%确定这是完全正确的,但我似乎对我有用。