Add recodetree script to convert non-ASCII file names to UTF-8

Add a script that allows to check a repository for non-ASCII file names,
and to convert the HEAD commit or the entire history from the current
system encoding to UTF-8.

Signed-off-by: Karsten Blees <blees@dcon.de>
This commit is contained in:
Karsten Blees 2012-01-15 23:04:58 +01:00
Родитель c56181a840
Коммит deb95f4bba
2 изменённых файлов: 75 добавлений и 1 удалений

74
bin/recodetree Normal file
Просмотреть файл

@ -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,\