Permalink
Browse files

Merge branch 'kb/recodetree' of git://github.com/kblees/msysgit into …

…devel
  • Loading branch information...
2 parents 4b313b3 + deb95f4 commit 2277691c29216e8807b7d74ffe517c6bdf613714 @kusma kusma committed Feb 6, 2012
Showing with 75 additions and 1 deletion.
  1. +74 −0 bin/recodetree
  2. +1 −1 share/WinGit/copy-files.sh
View
@@ -0,0 +1,74 @@
+#!/bin/sh
+# reencode file names in git tree objects from Windows system encoding to UTF-8
+
+usage()
+{
+ echo "WARNING this script is not intended as a full-fledged and fool-proof
+migration utility, but rather as a proof of concept or collection of examples.
+Use at your own risk.
+
+In particular, the script doesn't check or fix any non-ascii names in config
+files (such as .git/config, .gitignore or .gitmodules). For specific migration
+tasks, some of the commands in this script may require tweaking.
+
+Usage: recodetree <command>
+recodetree check Checks git repository for non-ascii file names.
+recodetree preview Same as 'check', but prints file names as if converted
+ from cp$(getcp) to UTF-8.
+recodetree head Converts the current HEAD from cp$(getcp) to UTF-8.
+ Does not commit, use git status to check results first.
+recodetree history Converts entire repository history from cp$(getcp) to UTF-8.
+ WARNING: this rewrites the history of the repository.
+ - Make a BACKUP copy of the repository before using this!
+ - Read 'git help filter-branch' for implications of
+ rewriting history."
+}
+
+check()
+{
+ # use fast-export to dump all file names in the history
+ git fast-export --no-data --signed-tags=strip --tag-of-filtered-object=drop --all |
+ # use awk to filter for non-ascii names
+ awk --posix '/^M [0-9]{6} [0-9a-f]{40} .*[\200-\377]/{print substr($0,51);}'
+}
+
+recode()
+{
+ # convert from system encoding to UTF-8
+ iconv -c -f cp$(getcp) -t utf-8
+}
+
+recode_tree()
+{
+ # clear the index
+ git rm -f -r -q --cached --ignore-unmatch \*
+ # list specified commit, reencode and add to index
+ git ls-tree -z -r $1 | recode | git update-index -z --index-info
+}
+
+case $1 in
+ check)
+ check
+ ;;
+
+ preview)
+ check | recode
+ ;;
+
+ head)
+ recode_tree HEAD
+ ;;
+
+ history)
+ git filter-branch --index-filter 'recodetree filter' -- --all
+ ;;
+
+ filter)
+ # used internally by recodetree history
+ recode_tree $GIT_COMMIT
+ ;;
+
+ *)
+ usage
+ ;;
+esac
@@ -45,7 +45,7 @@ dirname.exe,\
du.exe,echo,egrep,env.exe,expr.exe,false.exe,find.exe,flex.exe,gawk.exe,grep.exe,\
head.exe,id.exe,kill.exe,less.exe,libW11.dll,ln.exe,\
ls.exe,m4.exe,md5sum.exe,mkdir.exe,msys-1.0.dll,msysltdl-3.dll,mv.exe,patch.exe,\
-patch.exe.manifest,perl.exe,printf,ps.exe,pwd,rm.exe,rmdir.exe,rxvt.exe,\
+patch.exe.manifest,perl.exe,printf,ps.exe,pwd,recodetree,rm.exe,rmdir.exe,rxvt.exe,\
scp.exe,sed.exe,sh.exe,sleep.exe,sort.exe,split.exe,\
ssh-agent.exe,ssh.exe,ssh-add.exe,ssh-keygen.exe,ssh-keyscan.exe,\
tail.exe,tar.exe,tee.exe,touch.exe,tr.exe,true.exe,uname.exe,uniq.exe,\

0 comments on commit 2277691

Please sign in to comment.