gpt4 book ai didi

git - 包含混合编码文件的现有 Git 存储库

转载 作者:行者123 更新时间:2023-12-04 10:52:01 25 4
gpt4 key购买 nike

我有一个现有的存储库,其中包含混合编码的文件 - 有些文件是 UTF-8,有些是 ANSI(例如 Windows-1252)。大多数情况下一切正常,除了我厌倦了在对 ANSI 文件执行差异时看到“无效字符”,而且我特别恼火的是我不能使用我的 GUI 工具来暂存或取消暂存这些字符的大块头。我正在寻找一种方法来说服 Git,某个文件使用非 UTF-8 编码,这样 Git 将首先执行转换,然后对其施展魔法。

据我所知,有两种方法可以实现结果:

自定义二进制到文本过滤器

  • 向我的 .gitconfig 添加转换过滤器:
  •     [diff "win1252"]
    textconv = "iconv -f windows-1252 -t utf-8"
  • .gitattributes ,将文件标记为二进制文件并请求使用此过滤器将其转换为文本:
  •     *.txt    diff=win1252

    这种方法似乎在孤立的 git diff 中工作正常,但我遇到了几个我不知道如何解决的问题:
  • 即使与 core.autocrlf = true ,这种方法不会对转换命令的输出执行 CRLF 转换,因此我的 diff 将在更改的行中显示行尾差异。我可以创建一个脚本来运行 iconv 来执行编码转换,然后将输出传递给将执行 EOL 转换的 dos2unix,但它似乎相当笨拙。
  • 由于外部工具的使用非常频繁,我遇到了显着的减速。
  • 似乎命令行和我的 GUI (SourceTree) 在登台时都不尊重转换设置。 git add -p显示垃圾(甚至比“未知字符”更糟糕)并且 SourceTree 停止暂存并显示一条错误消息,指出它无法找到原始文本。

  • 虽然我可能能够学会忍受 #1 和 #2,但 #3 是一个阻塞问题,因为我主要需要完成此转换以促进其中包含“未知字符”的帅哥的登台。我当前的工作流程,我使用 git add -p没有任何转换,可能会显示“未知字符”,但至少它有效。

    对 GUI 进行不切实际的更改:我尝试过的所有其他 GUI 都有比这更严重的问题。

    使用工作树编码属性
  • .gitattributes , 将文件标记为具有自定义编码的文本文件:
  •     *.txt    text working-tree-encoding=windows-1252

    据我所知,这种方法涵盖了上面列出的所有提示,并且在命令行和 GUI 中都可以正常工作。不幸的是,有一个重要的警告:它仅适用于 的文件。已创建 设置此属性后。对于在添加此属性之前创建的文件,Git 将为包含这些未编码字符的每个文件显示更改(从“未知字符”到 windows-1252)。此外,在克隆存储库后,它会提示它“无法将 'a.txt' 从 UTF-8 编码到 windows-1252”。似乎该文件实际上已正确克隆(与原始文件逐字节匹配),但它仍然显示出差异。基本上,我将不得不提交带有“未知字符”的每个文件,以便在存储库中将其重新编码为 UTF-8,这会导致我的历史记录陷入困境,并且几乎使 Blame 无法使用。

    似乎一种现实的方法可能是使用类似 git filter-branch 的东西。 ,但是对于整个存储库(有没有类似的东西?)将所有现有文件转换为 UTF-8 将属性添加到第一次提交,但我担心做这么大的事情。此外,我希望我会丢失之前的提交 ID,这将是不幸的(我用提交 ID 标记我的可执行文件以轻松定位它们的构建版本)。

    有没有办法克服所描述方法的缺点,或者是否有另一种方法不会受到它们的影响?

    最佳答案

    使用 working-tree-encoding 您走在正确的轨道上,但您还需要一个步骤。

    在您创建 .gitattributes 的同一个提交中文件,运行 git add --renormalize . ,它将获取所有工作树文件并根据指定的编码对其进行过滤。然后您需要提交所有更改的文件和 .gitattributes文件在同一个提交中,此后它们将作为 UTF-8 存储在 repo 中,但在您的工作树中是 Windows-1252。

    这确实有git blame 的缺点。将不得不跳回到该提交之外,但您可以指定 --ignore-rev--ignore-revs-file (或配置选项 blame.ignoreRevsFile )忽略该修订,一切都会正常工作。

    关于git - 包含混合编码文件的现有 Git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59434963/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com