public
Last active — forked from tbroyer/git-svn-diff.sh

  • Download Gist
git-svn-diff.sh
Shell
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
#!/bin/bash
#
# git-svn-diff originally by (http://mojodna.net/2009/02/24/my-work-git-workflow.html)
# modified by mike@mikepearce.net
# modified by aconway@[redacted] - handle diffs that introduce new files
# modified by t.broyer@ltgt.net - fixes diffs that introduce new files
# modified by m@rkj.me - 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.* ]]
then
TRACKING_BRANCH=`git config --get svn-remote.svn.fetch | sed -e 's/.*:refs\/remotes\///'`
fi
 
# 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.*/===================================================================/"

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 https://gist.github.com/rage-shadowman/6325382 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

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.