问题
我正在尝试应用 this SO answer 中看到的解决方案。我也尝试过获取 this solution to the same question工作,但这两种情况我都没有成功。这两个都使用 clean/smudge 属性过滤器。
目标是提高 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
时输出符合预期。
经过一番研究,我发现实际上我确实有两个文件告诉 Git 需要对 .tex 文件做什么。我已将一个放在全局位置。哎呀。这个现在可以用了。 。 .还有下一个。至少对于清洁来说。在回答我自己的问题之前,我现在要检查一下污迹。
Sentence by Sentance .
这是我比较喜欢的。对我来说,以逻辑单元存储文件似乎是最合理的。段落是一个逻辑单元,但它太大而无法有效处理。句子是逻辑单元的下一个大小,大约是正确的。
这实际上是更简单的,因为它不是脚本,而是简单的单行 Perl 替换。
[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),我发现它转义了标点符号。删除多余的\
“混合”这一部分。
最佳答案
我觉得自己很傻。有人指出有一个拼写错误。在纠正这个错误的过程中,我发现我忘记了位于/home/nero/.config/.git/attributes 的全局属性文件。
这两项现在都按预期工作。
需要明确的是,问题是太多的配置文件说同样的事情让 Git 感到困惑。
关于git - 无法应用 git 属性过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51623143/