我正在做一个项目,它的文件编码不同.(我的操作系统是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文件混合在一起,那么icv将像这样被 destruct

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

我的问题是,是否有可能让像git diff这样的命令在不更改文件本身的情况下正常工作?我希望可以有一些脚本过滤非UTF-8文件的iconv或一些git配置,可以运行iconv只为非UTF-8文件.

Edit:这个项目的客户端要求一些文件有特定的编码,并希望尽可能少的更改以保持 solidity ,因此不可能直接修改文件的编码.最好是不修改项目的解决方法.

推荐答案

你可能需要git config diff driver

该驱动程序脚本将首先识别每个文件的编码,然后在显示差异之前将其转换为UTF-8(如果需要).

创建一个Shell脚本(例如,git-diff-encoding.shchmod +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文件中,添加以下几行以定义一个名为"Coding"的新diff驱动程序:

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

告诉Git这个新的diff驱动程序应该处理哪些文件.您可以在存储库的.gitattributes文件中执行此操作(如果该文件不存在,则在Git存储库的根文件夹中创建它).添加指定要由新的diff驱动程序处理的文件的行,例如:

*.cpp diff=encoding

现在,当对与.gitattributes文件中指定的模式匹配的文件运行git diff时,Git将使用您的定制diff脚本.

Linux相关问答推荐

我想强调某些条件是否与Linux中的全部输出匹配

通过ssh传输参数时避免字符串拆分

通过添加1位数字替换最后4位数字(不包括0x)

记录终端输入和输出的 Bash 脚本

命令行中使用`..`为什么会导致权限被拒绝错误?

如何让xargs对 bash 脚本中find命令找到的所有文件执行?

如何使 awk 输出更具可读性?

使用 awk 将多行文本转换为 CSV

在不调试的情况下查找哪个汇编指令导致了非法指令错误

如何将执行的shell命令的结果存储在python的变量中?

是否可以在 Linux x86 GAS 程序集中创建没有系统调用的线程?

让 Tk 看起来像一个原生 Linux 应用程序

加密/解密在两个不同的 openssl 版本之间不能很好地工作

为 django 项目安装 memcached

如何从任意 pthread_t 获取线程 ID?

为什么 JVM 报告的已提交内存比 linux 进程驻留集大小更多?

如何在 Linux 上取消关机?

Colored shell 脚本输出库

可以通过 SSH 连接的所有用户的列表

ImportError:在 ubuntu 14.04 中没有名为 _io 的模块