Can I recover lost commits in a SVN repository using a local tracking git-svn branch?

后端 未结 3 1301
故里飘歌
故里飘歌 2020-12-19 17:25

A SVN repo I use git-svn to track was recently corrupted and a backup was recovered. However, a week\'s worth of commits were lost in the recovery. Is it possible to recover

相关标签:
3条回答
  • 2020-12-19 17:47

    I found this article that shed some light on the detached_head situation.

    I've been dealing with more or less the same issue here and this is what I ended up doing:

    • First, always make sure you're on a valid branch git branch
    • If you see (no branch) (w/asterisk indicating "current branch"), that means you have a detached head
    • Checkout the detached head git co -b [BRANCH NAME] --track. Using the --track option, I THINK makes it track the git-svn HEAD and therefore reattachs this new branch to a HEAD.
    • Continue with git svn rebase/dcommit commands per usual.

    This is probably bad, but this also seemed to help - I deleted the master branch and then after doing a git svn rebase, it seems to add back in the master branch automatically.

    Also, I viewed the logs of a file and it seems that once I did a git svn dcommit, all the git checkins were intact from when my branch started going crazy and I was trying to do whatever I could to get it set back correctly.

    I'm not 100% sure this is completely correct, but I this seemed to work for me.

    0 讨论(0)
  • 2020-12-19 17:56

    Not a complete answer, but that thread may explain a bit the error message:

    'git svn dcommit' takes an optional revision argument, but the meaning of it was rather scary.
    It completely ignored the current state of the HEAD, only looking at the revisions between SVN and $rev.
    If HEAD was attached to $branch, the branch lost all commits $rev..$branch in the process.

    Considering that 'git svn dcommit HEAD^' has the intuitive meaning "dcommit all changes on my branch except the last one", we change the meaning of the revision argument.
    git-svn temporarily checks out $rev for its work, meaning that:

    • if a branch is specified, that branch (not the HEAD) is rebased as part of the dcommit,
    • if some other revision is specified, as in the example, all work happens on a detached HEAD and no branch is affected.

    I am not sure if that patch has been integrated in version Git, but if you test your dcommit, make sure to git branch -b after the dcommit, to reference the current HEAD with a branch.
    Will it work on the SVN side? I don't know.

    0 讨论(0)
  • 2020-12-19 18:04

    Here is how I achieved what I wanted:

    1. Re-cloned http://tracked-svn/trunk in a fresh git-svn repo.
    2. Added my old git-svn repo as a remote to the fresh repo. (eg. git remote add -f up-to-date /path/to/repo)
    3. git merge remotes/up-to-date/master
    4. git svn dcommit

    Rebasing on my old repo gives no errors, and dcommit works as expected.

    This might not be the best way to recover commits, but it got me what I wanted.

    0 讨论(0)
提交回复
热议问题