无法应用git属性过滤器

时间:2018-07-31 22:48:18

标签: git perl

问题

我正在尝试应用在this SO answer中看到的解决方案。我也尝试过使this solution to the same question正常工作,但是在两种情况下都没有成功。这两个都使用“清除/涂抹”属性过滤器。

目标是提高Git处理要处理的文件(LaTeX)的能力。

我做了什么

“您做了什么”的简短答案是“解决方案据说要做什么”,但是如果我忽略了某些内容,我将对其进行详细介绍。

我研究过的一个潜在问题是答案过时的可能性。通过查看Git Attributes Documentation,我认为可能唯一已经过时的是配置文件的位置。因此,我在回购的根目录中同时有一个.gitattributes文件和一个.git/info/attributes文件。我也只尝试了其中一种。

Word-by-word

虽然我不是希望获得解决方案的解决方案,但我认为我应该尝试不止一个,以期更好地识别出问题所在。我选择遍历此脚本,因为至少可以使脚本在Git之外运行。

我的配置文件中有

 [filter "wordbyword"]
    clean = /home/nero/myScripts/wordbyword.clean
    smudge = /home/nero/myScripts/wordbyword.smudge

我将上面的位置复制并粘贴到终端中,并在前面放置vim(这样您就知道我没有打错字)并将其内容粘贴到下面。首先clean,然后smudge,尽管要使用后者,前者必须起作用。 。这是问题所在。

#!/usr/bin/perl
use strict;
use warnings;

while (<>)
{
    print "$_\n" foreach (m/(.*?\s+)/go);
    print '#@#DELIM#@#' . "\n";
}

#!/usr/bin/perl
use strict;
use warnings;

while (<>)
{
    chomp; '#@#DELIM#@#' eq $_ and print "\n" or print;
}

属性文件就是*.tex filter=wordbyword

但是,当我运行git show HEAD:file.tex时,表明它已正常存储。

我知道该脚本有效。当我运行perl wordbyword.clean test.tex时,输出是预期的。

经过一番摸索,我发现实际上DID有两个文件告诉Git .tex文件需要做什么。我把一个放在全球的位置。哎呀。现在这个作品。 。 。以及下一个。至少用于清洁。在回答自己的问题之前,我现在要先检查一下污点。

Sentence by Sentance

这是我更喜欢的那个。对我来说,以逻辑单元存储文件似乎是最合理的。段落是一个逻辑单元,但其太大而无法有效处理。句子是逻辑单元的下一个大小,大约是正确的。

这实际上是更简单的方法,因为它是脚本的简单一行替换,而不是脚本。

[filter "sentencebreak"]
    clean = perl -pe \"s/[.]*?(\\?|\\!|\\.|'') /$&%NL%\\n/g unless m/%/||m/^[\\ *\\\\\\]/\"
    smudge = perl -pe \"s/%NL%\\n//gm\"

具有属性*.tex filter=sentencebreak

但是,当我用perl -pe "that long line" < test.tex进行替换而不是在每个句点打印换行符时,它将在每个空白处打印\n(并且不留句点)。我发现\\n似乎正在转义。将其更改为\n会使它产生换行符,但是它仍然在空白处中断,这不是我想要的。

仔细检查一下perl的替换(我对perl不好),我发现它避开了标点符号。删除多余的\“混合”了该部分。

1 个答案:

答案 0 :(得分:2)

我觉得很傻。有人指出,这是拼写错误。在纠正此错误的过程中,我发现我忘记了/home/nero/.config/.git/attributes的全局属性文件。

这两个项目现在都按预期工作。

需要明确的是,问题在于配置文件太多,这说明同一件事使Git感到困惑。