Ответ 1
Здесь решение в том же духе, что и sehe's, с несколькими изменениями, которые, надеюсь, будут касаться ваших комментариев:
- Это решение рассматривает слияние по предложению, а не по слову, как вы делали это вручную, только теперь пользователь увидит одну строку в абзаце, но git увидит параграфы, разбитые на предложения. Это кажется более логичным, поскольку добавление/удаление предложения из абзаца может быть совместимо с другими изменениями в абзаце, но, вероятно, более желательно иметь ручное слияние, когда одно и то же предложение редактируется двумя коммитами. Это также имеет преимущество "чистых" снимков, которые все еще могут быть читаемыми человеком (и латекс скомпилирован!).
- Фильтры представляют собой однострочные команды, которые должны облегчить перенос этого кода в соавторы.
Как и в решении saha, сделайте (или добавьте к) .gittatributes
.
*.tex filter=sentencebreak
Теперь, чтобы реализовать фильтры очистки и смазывания:
git config filter.sentencebreak.clean "perl -pe \"s/[.]*?(\\?|\\!|\\.|'') /$&%NL%\\n/g unless m/%/||m/^[\\ *\\\\\\]/\""
git config filter.sentencebreak.smudge "perl -pe \"s/%NL%\n//gm\""
Я создал тестовый файл со следующим содержимым, обратите внимание на однострочный абзац.
\chapter{Tumbling Tumbleweeds. Intro}
A way out west there was a fella, fella I want to tell you about, fella by the name of Jeff Lebowski. At least, that was the handle his lovin' parents gave him, but he never had much use for it himself. This Lebowski, he called himself the Dude. Now, Dude, that a name no one would self-apply where I come from. But then, there was a lot about the Dude that didn't make a whole lot of sense to me. And a lot about where he lived, like- wise. But then again, maybe that why I found the place s'durned innarestin'.
This line has two sentences. But it also ends with a comment. % here
После того, как мы передадим его локальному репо, мы увидим исходное содержимое.
$ git show HEAD:test.tex
\chapter{Tumbling Tumbleweeds. Intro}
A way out west there was a fella, fella I want to tell you about, fella by the name of Jeff Lebowski. %NL%
At least, that was the handle his lovin' parents gave him, but he never had much use for it himself. %NL%
This Lebowski, he called himself the Dude. %NL%
Now, Dude, that a name no one would self-apply where I come from. %NL%
But then, there was a lot about the Dude that didn't make a whole lot of sense to me. %NL%
And a lot about where he lived, like- wise. %NL%
But then again, maybe that why I found the place s'durned innarestin'.
This line has two sentences. But it also ends with a comment. % here
Итак, правила чистого фильтра - это когда он находит строку текста, которая заканчивается на .
или ?
или !
или ''
(что латексный способ делать двойные кавычки), затем пробел, он добавит% NL% и символ новой строки. Но он игнорирует строки, которые начинаются с\(латексные команды) или содержат комментарий где угодно (так что комментарии не могут стать частью основного текста).
Фильтр smudge удаляет% NL% и новую строку.
Дифференциация и слияние выполняются в "чистых" файлах, поэтому изменения в абзацах объединяются предложением по предложению. Это желаемое поведение.
Приятно, что файл латекса должен компилироваться в чистом или размытом состоянии, поэтому есть надежда на то, что соавторам не нужно ничего делать. Наконец, вы можете поместить команды git config
в оболочку script, которая является частью репо, поэтому соавтору просто нужно будет запустить его в корне репо для настройки.
#!/bin/bash
git config filter.sentencebreak.clean "perl -pe \"s/[.]*?(\\?|\\!|\\.|'') /$&%NL%\\n/g unless m/%/||m/^[\\ *\\\\\\]/\""
git config filter.sentencebreak.smudge "perl -pe \"s/%NL%\n//gm\""
fileArray=($(find . -iname "*.tex"))
for (( i=0; i<${#fileArray[@]}; i++ ));
do
perl -pe "s/%NL%\n//gm" < ${fileArray[$i]} > temp
mv temp ${fileArray[$i]}
done
Этот последний бит - это взлом, потому что, когда этот script запускается сначала, ветка уже выгружена (в чистой форме), и она не получает автоматически смазанного.
Вы можете добавить этот файл script и .gitattributes в репо, затем новым пользователям просто нужно клонировать, а затем запустить script в корне репо.
Я думаю, что этот script даже работает на windows git, если выполняется в git bash.
Недостатки:
- Это не относится к строкам с комментариями, а просто игнорирует их.
- % NL% - это уродливый
- Фильтры могут испортить некоторые уравнения (не уверен в этом).