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. |
Random Notes >