我有一个简单的(但希望快速解决)问题。我使用msys / tortoiseGit工具在windows下创建了一个git存档。行。现在我将repo复制到USB记忆棒并将其转移到linux机器上。
不幸的是,repo中的文件包含德语变音符号等(äöüß
)。在纯窗口下没有问题,我知道在纯Linux下也没有问题。
当我现在在本地克隆repo时,变音符号会被我的机器上无法显示的其他字符替换(导致?
)。目前我无法到达Windows机器修改任何东西。此外它应该很快就会工作,因为我将无法再访问Windows机器。
因此:
答案 0 :(得分:2)
除了重写档案外,不是我所知道的。
确保您的Windows编辑器使用UTF-8而不是本地代码页。
见下文。
您的Linux可能附带非UTF-8语言环境。在某种程度上,
LANG=de_DE.iso88591@euro
将请求您的程序以相同的编码进行读写。但是,这不是一个完整的解决方案;例如,无论内容编码如何,Gtk +都假定文件名为UTF-8。
重写Git仓库的常用方法是使用git-filter-branch
。这是我刚刚制作的一个例子,它应该重新编码文件名,文件内容和从ISO-8859-1到UTF-8的提交消息。
CONVERT='iconv -fiso8859-1 -tutf-8'
git filter-branch \
--index-filter '
git ls-files -z --stage |
while read -d "" mode ref stage name; do
[[ "$stage" = 0 || "$stage" = 1 ]] &&
printf "0 0000000000000000000000000000000000000000\t%s\0" "$name"
newname="$(echo "$name" | '"$CONVERT'")"
newref="$(
git cat-file blob "$ref" |
'"$CONVERT"' |
git hash-object -w --stdin)"
printf "%s %s %s\t%s\0" "$mode" "$newref" "$stage" "$newname"
done |
git update-index -z --index-info' \
--msg-filter "$CONVERT" \
$(git for-each-ref --format='%(refname)' refs/heads refs/tags)
小心:我没有在合并或二进制文件存在的情况下对此进行测试,并且使用git-filter-branch
很容易破坏大量历史记录。如果出现问题,git
会保留refs/original
名称空间中所有正面引用(已重写或未重写)的备份。
在answer之前找到一个惊人的VonC:在Windows上,使用msysgit
≥1.7.10,并修复现有的存储库,有recodetree
二进制文件(文件名)只是,不像上面那样。)
答案 1 :(得分:0)
Git将文件存储为二进制blob,因此如果不重写整个历史记录,则无法修复它。它不是修改仓库,而是修改文件。