如何更改Git提交';s编码头?

如何更改Git提交';s编码头?,git,encoding,header,commit,Git,Encoding,Header,Commit,Git中有没有重写提交编码头的方法?我有一些提交,其作者名为author name,具有ISO-8859-1编码名称,但提交编码头为空,默认为UTF-8。这会导致一些应用程序在解码提交时出错(例如Gitlab)。这同样适用于某些提交消息 一些想法?测试(使用git 2.2.0)表明,git commit在使用i18n.commitencoding=blah进行新提交时,向提交头添加encoding。这包括“修改后的”提交,这些提交只是新的提交,其父级是HEAD的父级-因此,如果您希望标记的现有提

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

一些想法?

测试(使用git 2.2.0)表明,
git commit
在使用
i18n.commitencoding=blah进行新提交时,向提交头添加
encoding
。这包括“修改后的”提交,这些提交只是新的提交,其父级是
HEAD
的父级-因此,如果您希望标记的现有提交位于
HEAD
,只需运行
git commit--amend
并退出编辑器,以编写一个新的(不同的)
HEAD
提交,并使用附加的头行

我没有测试
git-rebase-I
,但是由于它运行实际的cherry pick操作,并且
edit
模式允许您使用
git commit--amend
来创建一个新的
HEAD
commit,它肯定会工作。机械师可能不是最漂亮的

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

(正如eis所指出的,首先使用UTF-8可能更好。当然,您可以在修改过程中使用UTF-8,尽管这可能很棘手,也可能不棘手,具体取决于您的编辑器。)

这样解决:

$ 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

如果提交消息真的是一团糟,Sascha的解决方案不起作用(因为
file-b--mime编码-
不能说明真相),那么可以使用以下方法去除提交消息中的所有非ASCII字符:

git filter-branch --msg-filter '
  perl -pe 's/[^[:ascii:]]//g;'
  ' HEAD

显然,这远不是完美的,因为它杀死了所有类型的非英语字符,如umlauts,但在某些情况下(例如,由旧的cvs repo生成的git repo,带有可怕的编码提交消息),这可能是唯一的自动解决方案。

在这些字段中实际使用UTF-8不是更好吗?事实上是的。一般来说,无论哪种方式都应该是安全的。带有默认标头的UTF-8或带有重复标头字段的其他编码。旁注:这是由Solaris用户引起的。Solaris具有标准编码。user.name包含了一个德语Umlautä,我说的是大约2600次提交,所以我正在寻找一些自动方式来实现这一点。类似于过滤器分支——提交过滤器。但没有成功