【问题标题】:How to make git consider .strings files as text file instead of binary file如何让 git 将 .strings 文件视为文本文件而不是二进制文件
【发布时间】:2016-07-12 10:28:22
【问题描述】:

每次我们从不同的分支更改 .strings 文件(用于 iOS 本地化)时,都会发生冲突。

原因似乎是 git 将 .strings 视为二进制文件而不是文本文件。有时它有点烦人,因为 git 不会帮助自动合并更改,因为它们被认为是二进制格式。

是否有任何 git 设置会强制它将文件视为文本文件。

我注意到 SourceTree 和 GitLab 都无法判断它是文本文件。但是 XCode 本身将能够向我们展示差异。不确定这是否相关。

【问题讨论】:

    标签: git


    【解决方案1】:

    在我的情况下不需要 .gitattributes 和 .gitconfig 文件!

    您需要做的简单步骤:

    1. 打开当前可用的 .strings 文件并复制所有内容
    2. 打开终端输入nano <path/to/your/file/Localizable.strings> - 你可以在输入nano 后将文件拖放到终端 - 不要按回车
    3. 将文件删除到垃圾箱(以防万一失败)
    4. 返回终端并按回车
    5. 将剪贴板内容粘贴到终端
    6. control+xy 保存文件
    7. 对项目中的 .strings 文件重复此操作
    8. 在您的 .strings 文件上享受差异!

    【讨论】:

      【解决方案2】:

      按照此页面上的说明进行操作 https://gist.github.com/asmallteapot/11227602

      您不必将 .strings 文件转换为 UTF-8

      【讨论】:

        【解决方案3】:

        我发现最好的方法是使用 iconv 转换为 UTF8,其他的东西不能在 github 中查看差异。

        iconv -f utf-16 -t utf-8 path/to/localization/en.lproj/Localizable.strings > temp.strings
        mv temp.strings path/to/localization/en.lproj/Localizable.strings > temp.strings
        

        然后提交并合并您的更改。 后续差异将正确显示。

        【讨论】:

          【解决方案4】:

          我注意到SourceTree 不能仅区分英文本地化文件,其他都很好。所以看起来只有那个文件有问题。

          我已经用其他一些随机的Localized.strings 文件替换了英文文件,这些文件是SourceTree 差异确定,复制了英文翻译,提交和瞧 - 任何新的更改都由SourceTree 正确显示。

          请记住,您必须提交并查看它是否有效,因为您必须将固定的与固定的进行比较。

          【讨论】:

          • 感谢@Viktor Kucera,这很有效。我也尝试了其他方法,但没有运气。
          【解决方案5】:

          这是我在 Mac 上使用的脚本的变体。我需要将所有 .strings 文件转换为 utf-8 编码,包括其中一些已经在 utf-8 中的事实。从您的*.lproj 目录所在的文件夹运行它。

          STRING_FILES=$(find . -type f -name '*.strings')
          for f in $STRING_FILES; do 
            ENCODING=$(file -I $f)
            if [[ $ENCODING == *"utf-16le"* ]]; then
              iconv -f UTF-16 -t UTF8 $f > $f.1; 
              mv -f $f.1 $f
            fi
          done
          

          这个想法取自钟雨辰的回答

          【讨论】:

            【解决方案6】:

            没有一个解决方案对我有用,所以我做了更多的研究,在this link我发现了这个:

            • 在你的项目主目录中,创建或编辑一个 .gitattributes 文件添加这一行:

              *.strings diff=localizablestrings
              
            • 在主目录的 .gitconfig 文件中,添加以下行:

              [diff "localizablestrings"]
              textconv = "iconv -f utf-16 -t utf-8"
              

            这成功了。

            【讨论】:

              【解决方案7】:

              在尝试了 Jonathan 或 Slawomir 的解决方案后,我仍然无法正确查看差异。它们仍被视为二进制文件。

              我终于发现我们的 localizable.strings 文件不是 UTF-8 编码,而是 UTF-16 编码。将编码改回UTF-8后,就可以正常使用了。

              可以更改编码吗?是的。实际上,Apple 建议使用 UTF-8。

              注意:建议您使用 UTF-8 编码保存字符串文件,这是标准字符串文件的默认编码。当将字符串文件复制到产品中时,Xcode 会自动将字符串文件从 UTF-8 转码为 UTF-16。

              [reference]

              你怎么知道那个文件的编码是什么?命令行见this,Xcode见this

              file -I vol34.tex 
              

              参见下面的 cmets,您可能需要手动更改文件的编码:

              iconv -f UTF-16 -t UTF8 file.strings
              

              【讨论】:

              • 我尝试使用 Xcode 9.2 来执行此操作,但它实际上并没有更改文件编码。它只改变了 .xcproj 文件认为文件编码的内容。用iconv -f UTF-16 -t UTF8 file.strings 修复。
              • @EdwardThomson 哈哈。谢谢!但我想我会暂时保留已接受的答案。乔纳森的回答当时确实帮助了我 IIRC。如果以后这个答案得到的票数比那个答案多,我会更改绿色勾号;)
              • 对我来说,转换为 UTF-8 也可以解决问题。但是,我使用的是genstrings,它以 UTF-16LE 生成文件,因此每次运行时我都需要将其转换回 UTF-8。此外,使用 iconv 和 Xcode 将文件转换为 UTF-8 对我来说不起作用,我最终使用了 VS Code。
              【解决方案8】:

              请在你的项目根目录文件.gitattributes添加内容:

              *.strings  text
              

              现在 git 会将您的文件 .strings 识别为文本文件。

              【讨论】:

              • @jonathan-brink 建议 diff 而你建议 text;有什么区别?
              • 来自手册:在路径上设置文本属性可启用行尾规范化并将路径标记为文本文件。在不猜测内容类型的情况下进行行尾转换。
              • 并且:设置了 diff 属性的路径被视为文本,即使它们包含通常不会出现在文本文件中的字节值,例如 NUL。
              【解决方案9】:

              在你的仓库根目录创建一个.gitattributes 文件,内容如下:

              *.strings diff
              

              更多信息:https://git-scm.com/docs/gitattributes

              【讨论】:

              • @slawomir-jaranowski 建议 text 而你建议 diff;有什么区别?
              • 使用 diff 会导致使用默认的 difftool 区分该类型的文件
              猜你喜欢
              • 1970-01-01
              • 2011-10-14
              • 2010-10-02
              • 1970-01-01
              • 2020-06-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多