1#!/bin/bash 2 3if [ $# -ne 1 ]; then 4 echo "Invalid arguments!" 5 echo "$0 <rNNNNNN | git-hash>" 6 exit 1 7fi 8 9if [ -n "$(git status -uno -s --porcelain)" ]; then 10 echo "You have unstashed changes. Please stash and then revert." 11 git status -uno 12 exit 1 13fi 14 15COMMIT=$1 16OTHER=$(git svn find-rev "$COMMIT") 17if [ $? -ne 0 ]; then 18 echo "Error! Could not find an svn/git revision for commit $COMMIT!" 19 exit 1 20fi 21 22if [ -n "$(echo $COMMIT | grep '^r[0-9]\+')" ]; then 23 SVN=`echo $COMMIT | sed -e 's/^r//'` 24 GIT=$OTHER 25else 26 SVN=$OTHER 27 GIT=$COMMIT 28fi 29 30# Grab the one line message for our revert commit message. 31ONE_LINE_MSG=$(git log --oneline $GIT -1 | cut -f2- -d " ") 32 33# Revert the commit. 34git revert --no-commit $GIT 2>/dev/null 35if [ $? -ne 0 ]; then 36 echo "Error! Failed to revert commit r$SVN. Resetting to head." 37 git reset --hard HEAD 38 exit 1 39fi 40 41# Create a template in our .git directory. 42TEMPLATE="`git rev-parse --git-dir`/git-svn-revert-template" 43cat > $TEMPLATE <<EOF 44Revert "$ONE_LINE_MSG" 45 46This reverts commit r$SVN. 47EOF 48 49# Begin the commit but give our user an opportunity to edit it. 50git commit --file="$TEMPLATE" --edit 51if [ $? -ne 0 ]; then 52 echo "Error! Failed to commit reverting commit for commit r$SVN. Reverting to head." 53 git reset --hard HEAD 54 rm -rf $TEMPLATE 55 exit 1 56fi 57 58rm -rf $TEMPLATE 59 60