Git - 打印以不同编码混合的文件

问题描述 投票:0回答:1

我正在做一个项目,其文件的编码不同。(我的操作系统是centos 7)

例如,

$SRC/a.cpp
可能以UTF-8编码,而
$SRC/b.cpp
则以GB 2312(简体中文)编码。

现在如果我输入

git diff
,由于混合编码,内容将无法正常显示。

我已经尝试过

iconv
这样

git diff HEAD~1 | iconv -f gb2312 -t utf8 | less

如果涉及到的所有文件都采用 GB 2312 编码的话,效果很好。但是如果混合任何 UTF-8 文件,那么 iconv 就会像这样崩溃

some well displayed UTF-8 text
...
iconv: illegal input sequence at position 120

我的问题是,是否可以在不更改文件本身的情况下使像

git diff
这样的命令正常工作?我希望可以有一些脚本过滤非 UTF-8 文件的
iconv
或一些
git
配置,可以仅针对非 UTF-8 文件运行
iconv

编辑:该项目的客户要求某些文件具有特定的编码,并且为了稳定性希望尽可能少的更改,因此无法直接修改文件的编码。最好采用不修改项目的解决方法。

linux git iconv
1个回答
0
投票

您可能需要一个

git config
diff 驱动程序

该驱动程序脚本将首先识别每个文件的编码,然后根据需要将其转换为 UTF-8,然后再显示差异。

创建一个 shell 脚本(例如

git-diff-encoding.sh
,带有
chmod +x git-diff-encoding.sh
),用于识别文件的编码,然后根据需要将其转换为 UTF-8,然后再显示差异。

#!/bin/bash

FILE1="path/to/file1"
FILE2="path/to/file2"

# Identify encoding of the files using file command
ENC1=$(file -bi "$FILE1" | awk -F charset= '{print $2}')
ENC2=$(file -bi "$FILE2" | awk -F charset= '{print $2}')

# Convert files to UTF-8 if necessary
[ "$ENC1" != "utf-8" ] && iconv -f "$ENC1" -t utf-8 "$FILE1" -o "$FILE1".utf8
[ "$ENC2" != "utf-8" ] && iconv -f "$ENC2" -t utf-8 "$FILE2" -o "$FILE2".utf8

# Run git diff with potentially converted files
git diff --no-index "${FILE1}${ENC1:+.utf8}" "${FILE2}${ENC2:+.utf8}"

在您的

.git/config
文件中,添加以下行来定义一个名为“encoding”的新 diff 驱动程序:

[diff "encoding"]
    command = /path/to/your/git-diff-encoding.sh

告诉 Git 哪些文件应该由这个新的 diff 驱动程序处理。您可以在存储库的

.gitattributes
文件中执行此操作(如果不存在,请在 Git 存储库的根文件夹中创建它)。添加行指定新的 diff 驱动程序要处理的文件,例如:

*.cpp diff=encoding

现在,git 将在运行

git diff
时使用您的自定义 diff 脚本来查找与
.gitattributes
文件中指定的模式匹配的文件。

© www.soinside.com 2019 - 2024. All rights reserved.