gpt4 book ai didi

Git 在一行内 merge

转载 作者:IT王子 更新时间:2023-10-29 00:43:52 26 4
gpt4 key购买 nike

序言

我正在使用 git 作为我实验室正在用 LaTeX 撰写的论文的版本控制系统。有几个人在协作。

我遇到了 git,它对 merge 的方式很固执。假设两个人对一行进行了单个单词的更改,然后尝试将它们 merge 。尽管 git diff --word-diff 似乎能够逐字显示分支之间的差异,但 git merge 似乎无法逐字执行 merge ,而是需要手动 merge 。

对于 LaTeX 文档,这尤其令人讨厌,因为编写 LaTeX 时的常见习惯是每行写一个完整的段落,并让文本编辑器在为您显示时处理自动换行。我们现在正在通过为每个句子添加一个换行符来解决这个问题,这样 git 至少可以 merge 一个段落中不同句子的更改。但是它仍然会对一个句子中的多个变化感到困惑,这当然会使文本不再很好地换行。

问题

有没有办法“逐字”而不是“逐行” merge 两个文件?

最佳答案

这是一个与 sehe 相同的解决方案,但有一些更改,希望能解决您的意见:

  • 此解决方案考虑按句子而不是按单词 merge ,就像您以前手动执行的那样,只是现在,用户将看到每个段落一行,但 git 会看到段落被分解成句子.这似乎更合乎逻辑,因为从段落中添加/删除句子可能与段落中的其他更改兼容,但当同一个句子被两次提交编辑时,手动 merge 可能更可取。这也有一个好处,即“干净”的快照在某种程度上仍然是人类可读的(并且 latex 可编译!)。
  • 过滤器是单行命令,应该可以更轻松地将其移植给协作者。

如 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's 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's 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's 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's why I found the place s'durned innarestin'.

This line has two sentences. But it also ends with a comment. % here

因此,clean 过滤器的规则是每当它找到以 . 结尾的文本字符串时或 ?!'' (这是做双引号的胶乳方式)然后是一个空格,它将添加 %NL% 和一个换行符。但它会忽略以\(latex 命令)开头或在任何地方包含注释的行(这样注释就不会成为正文的一部分)。

污迹过滤器移除 %NL% 和换行符。

差异和 merge 是在“干净”的文件上完成的,因此对段落的更改会逐句 merge 。这是期望的行为。

好的是 latex 文件应该在干净或污迹状态下编译,因此合作者有希望不需要做任何事情。最后,你可以把 git config shell 脚本中的命令是 repo 的一部分,因此协作者只需在 repo 的根目录中运行它即可进行配置。

    #!/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

最后一点是 hack,因为当这个脚本第一次运行时,分支已经被 check out (以干净的形式)并且它不会自动被弄脏。

您可以将此脚本和.gitattributes 文件添加到存储库中,然后新用户只需克隆,然后在存储库的根目录中运行脚本即可。

如果在 git bash 中完成,我认为这个脚本甚至可以在 Windows git 上运行。

缺点:

  • 这不会巧妙地处理带有注释的行,它只是忽略它们。
  • %NL% 有点丑
  • 过滤器可能会搞砸一些方程式(对此我不确定)。

关于Git 在一行内 merge ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com