Random Notes‎ > ‎

git-svn interrupted dcommit (disconnect)

posted Feb 25, 2010, 8:10 AM by William Shallum
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 `866fd153d0f5a457ce9f76c8e1b3a9752bf38663`. `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.

Now, `git log` seems to show all the relevant commits, and I'm once more a happy git user. To continue
working with `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.