Created — forked from tbroyer/

Embed URL


SSH clone URL

You can clone with HTTPS or SSH.

Download Gist
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
# git-svn-diff originally by (
# modified by
# modified by aconway@[redacted] - handle diffs that introduce new files
# modified by - fixes diffs that introduce new files
# modified by - fix sed syntax issue in OS X
# Generate an SVN-compatible diff against the tip of the tracking branch
# Get the tracking branch (if we're on a branch)
TRACKING_BRANCH=`git svn info | grep URL | sed -e 's/.*\/branches\///'`
# If the tracking branch has 'URL' at the beginning, then the sed wasn't successful and
# we'll fall back to the svn-remote config option
if [[ "$TRACKING_BRANCH" =~ URL.* ]]
TRACKING_BRANCH=`git config --get svn-remote.svn.fetch | sed -e 's/.*:refs\/remotes\///'`
# Get the highest revision number
REV=`git svn find-rev $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH)`
# Then do the diff from the highest revision on the current branch
# and masssage into SVN format
git diff --no-prefix $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH) $* |
sed -e "/--- \/dev\/null/{ N; s|^--- /dev/null\n+++ \(.*\)|---\1 (revision 0)\n+++\1 (revision 0)|;}" \
-e "s/^--- .*/& (revision $REV)/" \
-e "s/^+++ .*/& (working copy)/" \
-e "s/^diff --git [^[:space:]]*/Index:/" \
-e "s/^index.*/===================================================================/"
vadz commented

In spite of several fixes, this still doesn't seem to handle new files correctly. This gist does work for me however (notably, it uses "working copy" for the new files instead of "revision 0"), so I ended up combining git commands from this one with sed commands from the other one.

See my branch for a much cleaner way to get the tip of the tracking branch (using git log the same way that git does to determine which branch to dcommit to -- as per the CAVEATS section of the git-svn man page).

The reason it doesn't handle new files correctly is because of the first line of the sed command not adding a space between ---/+++ and \1.

See for an updated version of this which gives identical output (in all of my tests so far) to svn diff.

Seems the script doesn't take chmod messages into account...
new file mode 100755

songpp commented

on my laptop(osx 10.10.3) sed doesn't write newline ('\n') correctly.

change the line #27

sed -e "/--- \/dev\/null/{ N; s|^--- /dev/null\n+++ \(.*\)|---\1    (revision 0)\n+++\1 (revision 0)|;}" \


sed -e '/^--- \/dev\/null/{ N; s|^--- /dev/null\n+++ \(.*\)|---\1   (revision 0)\
+++\1   (revision 0)|;}' \

that is, change double quote to single quote and replace the '\n' by a backslash followed by a newline character.
fixes it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.