如何更改Git提交的编码头?

时间:2015-03-10 08:54:08

标签: git encoding header commit

Git中有没有办法重写commit encoding标题?我有一些author name的提交,其ISO-8859-1编码名称但提交编码标头为空,默认为UTF-8。这导致一些应用程序在解码提交时出错(例如Gitlab)。同样适用于某些提交消息。

一些想法?

3 个答案:

答案 0 :(得分:2)

解决这个问题:

$ git filter-branch -f --commit-filter '
author_type=$( echo $GIT_AUTHOR_NAME | file -b --mime-encoding - )
author=$( echo $GIT_AUTHOR_NAME | iconv -f $author_type -t UTF-8 )
GIT_AUTHOR_NAME=$author

committer_type=$( echo $GIT_COMMITTER_NAME | file -b --mime-encoding - )
committer=$( echo $GIT_COMMITTER_NAME | iconv -f $committer_type -t UTF-8 )
GIT_COMMITTER_NAME=$committer

git commit-tree "$@";' --msg-filter '
cat > .commitmsg
type=$(cat .commitmsg|file -b --mime-encoding -)
cat .commitmsg|iconv -f $type -t UTF-8
' HEAD

$ rm -f .commitmsg

答案 1 :(得分:2)

如果提交消息真的搞砸了并且Sascha的解决方案不起作用(因为file -b --mime-encoding -没有说实话),可以使用以下方法来删除提交消息中的每个字符那不是ASCII:

git filter-branch --msg-filter '
  perl -pe 's/[^[:ascii:]]//g;'
  ' HEAD
很明显,这远非完美,因为它杀死了各种非英语角色,如变音符号,但在某些情况下(即由旧的cvs-repo产生的git-repo带有可怕的编码提交消息)它可能是唯一的自动解决方案。

答案 2 :(得分:1)

测试(使用git 2.2.0)显示,只要您使用git commit进行新提交,encoding <blah>就会向提交标头添加i18n.commitencoding = blah。这包括&#34;修正&#34;提交 - 这只是新的提交,其父级是HEAD的父级,因此,给定您希望标记为HEAD的现有提交,只需运行git commit --amend并退出编辑器,使用附加标题行编写一个新的(不同的)HEAD提交。

我没有测试git rebase -i,但由于这会运行实际的挑选操作,而edit模式允许您使用git commit --amend进行新的HEAD提交,一定会工作的。机制可能不是最漂亮的。

要查看原始提交(包括其编码行),请使用git cat-file -p HEAD(或其他一些提交ID代替HEAD)。

(正如eis注意到in a comment,首先使用UTF-8可能更好。当然,您可以将此作为修改过程,尽管它可能 - 或者可能不是根据你的编辑而变得棘手。)