如何让git将.strings文件视为文本文件而不是二进制文件

时间:2016-03-24 17:54:10

标签: git

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

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

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

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

enter image description here

8 个答案:

答案 0 :(得分:13)

使用以下内容在您的仓库的根目录下创建一个.gitattributes文件:

*.strings diff

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

答案 1 :(得分:10)

在尝试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 

请参阅下面的评论,您可能需要手动更改文件的编码:

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

答案 2 :(得分:4)

这些解决方案都不适合我,因此我做了更多研究,在this link我发现了这一点:

  • 在项目主目录中,创建或编辑.gitattributes文件,并添加以下行:

    <!DOCTYPE html>
    <html>
    <body>
    <script>
    var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
    var SpeechGrammarList = SpeechGrammarList || webkitSpeechGrammarList;
    var SpeechRecognitionEvent = SpeechRecognitionEvent || webkitSpeechRecognitionEvent;
    var grammar = '#JSGF V1.0; import <com.sun.speech.app.numbers.*>; grammar numbers; public <number> = <com.sun.speech.app.numbers.*>;'
    
    
    var recognition = new SpeechRecognition();
    var speechRecognitionList = new SpeechGrammarList();
    speechRecognitionList.addFromString(grammar, 1);
    recognition.grammars = speechRecognitionList;
    //recognition.continuous = false;
    recognition.lang = 'en-US';
    recognition.interimResults = true;
    recognition.maxAlternatives = 1;
    recognition.onerror = function(event) {
        console.log(event.error);
    };
    
    document.body.onclick = function() {
      recognition.start();
      console.log('Ready to receive a number command.');
    };
    recognition.onresult = function(event) {
      var numbers = ['zero', 'one', 'two'];
      console.log(event.results);
      var last = event.results.length - 1;
      var number = event.results[last][0].transcript;
      console.log(numbers[number]);
      var node = document.querySelector("#" + numbers[number]);
      if (node) {
        node.style.color = 'red';
      } 
    };
    </script>
    <div id="one">one</div>
    <div id="two">two</div>
    </body>
    </html>
    
  • 在主目录的.gitconfig文件中,添加以下行:

    *.strings diff=localizablestrings
    

这成功了。

答案 3 :(得分:1)

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

*.strings  text

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

答案 4 :(得分:1)

这是我在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

这个想法是从钟雨辰的答案中提取的

答案 5 :(得分:0)

我注意到SourceTree不能只区分英语本地化文件,其他都可以。因此,似乎只有该文件有问题。

我已经用其他一些随机的Localized.strings文件替换了英语文件,这些文件SourceTree可以,SourceTree复制了英语翻译,提交并确认-{{1} }。

请记住,由于必须将固定值与固定值进行比较,因此必须提交并查看其是否有效。

答案 6 :(得分:0)

我发现执行此操作的最佳方法是使用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

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

答案 7 :(得分:0)

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

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