我有一个现有的存储库,其中包含混合编码的文件 - 有些文件采用 UTF-8,有些文件采用 ANSI(例如 Windows-1252)。大多数情况下一切都工作正常,除了我厌倦了在 ANSI 文件上执行 diff 时看到“无效字符”,而且我特别恼火的是我无法使用我的 GUI 工具来暂存或取消暂存这些字符的块。我正在寻找一种方法来说服 Git 某个文件使用非 UTF-8 编码,以便 Git 会先执行转换,然后再对其施展魔法。
据我所知,有两种方法可以实现这一结果:
[diff "win1252"]
textconv = "iconv -f windows-1252 -t utf-8"
Run Code Online (Sandbox Code Playgroud)
.gitattributes,将文件标记为二进制并请求使用此过滤器将其转换为文本: *.txt diff=win1252
Run Code Online (Sandbox Code Playgroud)
这种方法似乎在孤立的情况下工作得很好git diff,但我遇到了几个我不知道如何解决的问题:
core.autocrlf = true,此方法也不会对转换命令的输出执行 CRLF 转换,因此我的 diff 将显示更改行中的行尾差异。我可以创建一个脚本,该脚本将运行 iconv 来执行编码转换,然后将输出传递给 dos2unix,后者将执行 EOL 转换,但这似乎相当严厉。git add -p显示垃圾(甚至比“未知字符”更糟糕),并且 SourceTree 停止暂存并显示一条错误消息,指出它无法找到原始文本。虽然我可能能够学会忍受#1和#2,但#3是一个阻塞问题,因为我主要需要完成这种转换,以方便上演带有“未知字符”的帅哥。我当前的工作流程(在git add -p没有任何转换的情况下使用)可能会显示“未知字符”,但至少它可以工作。
对 GUI 的更改是不切实际的:我尝试过的所有其他 GUI 都有比这更严重的问题。
在我的一些 Windows 10 计算机上,FindFirstFile匹配绝对不应该匹配的文件。假设Delphi中有以下程序:
{$apptype console}
uses Windows;
var
FindHandle: THandle;
FindData: WIN32_FIND_DATA;
begin
FindHandle := FindFirstFile('*.qqq', FindData);
if FindHandle <> INVALID_HANDLE_VALUE then
begin
try
repeat
Writeln(PChar(@FindData.cFileName[0]));
until not FindNextFile(FindHandle, FindData);
finally
FindClose(FindHandle);
end;
end;
end.
Run Code Online (Sandbox Code Playgroud)
和四个文件:
a.qqq
b.qqqt
c.qqqx
c.qqq123
Run Code Online (Sandbox Code Playgroud)
我期望得到的输出只是a.qqq. 但实际发生的情况是,所有四个文件都被打印出来。我使用 CMDdir *.qqq也得到了相同的结果,所以这不仅仅是 Delphi 做了奇怪的事情,而且 PowerShell 也dir *.qqq按预期工作。什么可能导致这种行为?特别是,如果它是操作系统中的某些特定设置(这似乎是因为我没有在所有机器上得到这个结果,只是在某些机器上得到这个结果),我是否可以在程序中执行某些操作来强制执行无论操作系统设置如何,预期行为?
我正在使用 Windows 版 Git(版本 2.15,但同样的问题出现在 2.14 中,我认为旧版本也有),并且我注意到一个相当烦人的行为:当我执行一些基本的 git 操作*)时,.git 的修改日期/objects/pack/pack-*.pack 文件更改。文件本身保持不变,但上次修改日期字段已更新,这导致我的备份软件认为文件已更改并需要添加到我的差异备份中。由于我的 .pack 文件相当大,这会显着增加我每日备份的大小。有没有办法阻止这种行为?也就是说,保持包文件完全不变,包括其元数据,直到我执行 git gc 或 git repack?
不幸的是,我无法确定哪个操作导致了这种行为。今天发生这种情况时,我只使用了 git status、git log、git add、git mv 和 git commit,没有使用其他任何东西,并且日期/时间发生了更改,但是当我尝试在昨天的备份上复制该行为时,日期更改并没有不会发生。我想下次我将运行进程监视器并监视对文件的访问,但与此同时,有人知道可能导致此问题的原因吗?谢谢。