{"thread":{"id":"23489","subject":"Replay subversion into git via filesystem","startedAt":"2010-04-16T08:29:03Z","lastAt":"2010-04-16T08:29:03Z","messageCount":1,"participants":["David Michael Barr"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"139659","messageId":"BF711404-63BB-4212-A0F9-0025D1D6F7C5@cordelta.com","threadId":"23489","inReplyTo":null,"subject":"Replay subversion into git via filesystem","fromName":"David Michael Barr","fromEmail":"david.barr@cordelta.com","sentAt":"2010-04-16T08:29:03Z","receivedAt":"2010-04-16T08:29:03Z","isPatch":false,"sender":{"key":"david.barr@cordelta.com","avatar":"https://avatars.githubusercontent.com/u/220594?v=4"},"body":"Hi all,\n\nIn response to some recent questions about big imports of svn history\ninto git and as a part of my svn-dump-fast export project, I have\ncreated a simple bash script to replay the root of a svn repository\ninto a git repository.\nThe assumption is that svnsync is used to pull the remote repository\nand that svk is used to manage the working copy.\n\nThe mirror might be set up like so:\nsvnadmin create /path/to/mirror\nsvnsync init file:///path/to/mirror http://remote.com/svn\nsvnsync sync file:///path/to/mirror\nsvk depot depot_name /path/to/mirror\n\nI'd appreciate any comments on the correctness of the script.\n\n--\nDavid Barr\n--\n\n#!/bin/bash\nSVK_DEPOT=\"\"\nCO_DIR=validation\nHASH_DIR=.git/wc\n\nSVN_UUID=`svk pg --revprop -r0 svn:sync-from-uuid /$SVK_DEPOT/`\nSVN_URL=`svk pg --revprop -r0 svn:sync-from-url /$SVK_DEPOT/`\nMAX_REV=`svk pg --revprop -r0 svn:sync-last-merged-rev /$SVK_DEPOT/`\n\necho SVN_UUID: $SVN_UUID\necho SVN_URL: $SVN_URL\necho MAX_REV: $MAX_REV\n\nsvk co -r1 /$SVK_DEPOT/ $CO_DIR\ncd $CO_DIR\ngit init\nmkdir -p $HASH_DIR/{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}\\\n{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}\nfor (( REV=1 ; REV<=MAX_REV ; ++REV )) do\n  svk up -r$REV\n  # Hashify working copy\n  git update-index --refresh 2>/dev/null\n  git ls-files -modz | tee .git/filelist \\\n   | git update-index -z --add --replace --remove --stdin\n  xargs -0 git ls-files -s < .git/filelist | (\n    while read MODE HASH STAGE FILE ; do\n      HASH_FILE=\"$HASH_DIR/${HASH:0:2}/$HASH$MODE\"\n      ln \"$FILE\" \"$HASH_FILE\" 2>/dev/null || \\\n        ln -f \"$HASH_FILE\" \"$FILE\"\n    done\n  )\n  SVN_AUTHOR=`svk pg --revprop -r$REV svn:author`\n  SVN_DATE=`svk pg --revprop -r$REV svn:date`\n  export GIT_COMMITTER_NAME=$SVN_AUTHOR\n  export GIT_COMMITTER_EMAIL=$SVN_AUTHOR\"@\"$SVN_UUID\n  export GIT_COMMITTER_DATE=\"`date -juf '%FT%T' $SVN_DATE \\\n    '+%F %T %z' 2>/dev/null`\"\n  export GIT_AUTHOR_NAME=\"$GIT_COMMITTER_NAME\"\n  export GIT_AUTHOR_EMAIL=\"$GIT_COMMITTER_EMAIL\"\n  export GIT_AUTHOR_DATE=\"$GIT_COMMITTER_DATE\"\n  GIT_PARENT=\"\"\n  [ $REV -gt 1 ] && GIT_PARENT=\"-p `git show-ref --head -s HEAD`\"\n  GIT_TREE=`git write-tree`\n  echo git commit-tree $GIT_TREE $GIT_PARENT\n  GIT_COMMIT=`svk pg --revprop -r$REV svn:log \\\n   | git commit-tree $GIT_TREE $GIT_PARENT`\n  git update-ref HEAD $GIT_COMMIT\n  git tag $REV\n  git gc --auto\ndone\n"}]}