git-svn interrupted dcommit (disconnect)
Posted Feb 25 2010, 16:10 by William Shallum [updated May 13 2013, 02:09]
Given my flaky internet connection, it is no surprise that it decided
to drop the signal in the middle of a
git svn dcommit. After I
interrupted the process using Ctrl-C,
git status showed a lot of
uncommited changes. Uh-oh. Where did my commits go?
$ git svn dcommit ... some/file: needs update some/other/file: needs update M some/file M some/other/file Committed r98 <internet connection drops here, Ctrl-C pressed> $ git svn dcommit Cannot dcommit with a dirty index. Commit your changes first, or stash them with `git stash'. at /usr/bin/git-svn line 415 $ git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # # modified: some/file # modified: another/file # modified: yet/another/redacted/file # no changes added to commit (use "git add" and/or "git commit -a")
To fix this, search
.git/logs/HEAD for a commit ID (or use
git reflog). Here are the relevant lines from my
.git/logs/HEAD file (towards the bottom).
62ad9df05eea6ac60fa39be213604596e3c05ceb 866fd153d0f5a457ce9f76c8e1b3a9752bf38663 William Shallum <my-email-address> 1235659917 +0000 rebase: <commit message redacted> 866fd153d0f5a457ce9f76c8e1b3a9752bf38663 96153576e273e1f0f1a95e485fc69f35a71eda32 William Shallum <my-email-address> 1235660040 +0000 refs/remotes/git-svn: updating HEAD 96153576e273e1f0f1a95e485fc69f35a71eda32 62354d5bc4fede8bd7effa6362ecb9c4f177205e William Shallum <my-email-address> 1235660099 +0000 refs/remotes/git-svn: updating HEAD
Now, I need to get it back to the commit
git checkout will do that nicely.
$ git checkout 866fd153d0f5a457ce9f76c8e1b3a9752bf38663 Note: moving to "866fd153d0f5a457ce9f76c8e1b3a9752bf38663" which isn't a local branch If you want to create a new branch from this checkout, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new_branch_name> HEAD is now at 866fd15... <commit message redacted>
Now I’m … nowhere… This is a detached head situation.
$ git status # Not currently on any branch.
Now to make this the HEAD of my master branch:
$ git rebase --onto HEAD 866fd153d0f5a457ce9f76c8e1b3a9752bf38663 master First, rewinding head to replay your work on top of it... Nothing to do.
git log seems to show all the relevant commits, and I’m once
more a happy git user. To continue
git svn, I need to do
git svn fetch and
git svn rebase. Only after issuing those two
commands can I
git svn dcommit.
$ git svn dcommit Committing to http://my-svn-server/my-repo/trunk Merge conflict during commit: File or directory 'one/of/my/files' is out of date; try updating: resource out of date; try updating at /usr/bin/git-svn line 461 $ git svn fetch $ git svn rebase First, rewinding head to replay your work on top of it... Applying <one of my commits> Applying <another commit> Applying <yet another commit> $ git svn dcommit <appears to hang due to stupid Internet connection, but eventually works>
If this often happens, I suppose this workflow by Imran M Yousouf might be worth trying.