- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
序言
我正在使用 git 作为我实验室正在用 LaTeX 撰写的论文的版本控制系统。有几个人在协作。
我遇到了 git,它对 merge 的方式很固执。假设两个人对一行进行了单个单词的更改,然后尝试将它们 merge 。尽管 git diff --word-diff 似乎能够逐字显示分支之间的差异,但 git merge 似乎无法逐字执行 merge ,而是需要手动 merge 。
对于 LaTeX 文档,这尤其令人讨厌,因为编写 LaTeX 时的常见习惯是每行写一个完整的段落,并让文本编辑器在为您显示时处理自动换行。我们现在正在通过为每个句子添加一个换行符来解决这个问题,这样 git 至少可以 merge 一个段落中不同句子的更改。但是它仍然会对一个句子中的多个变化感到困惑,这当然会使文本不再很好地换行。
问题
有没有办法“逐字”而不是“逐行” merge 两个文件?
最佳答案
这是一个与 sehe 相同的解决方案,但有一些更改,希望能解决您的意见:
如 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 上运行。
缺点:
关于Git 在一行内 merge ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587626/
我时不时地输入“git”,然后想到别的东西,然后输入例如“git checkout master”。当然,这给我留下了 $ git git checkout master git: 'git' is
我做到了 git 克隆 git://foo.git 光盘富 ...编辑文件.. 现在我想重新开始。我不在乎我已经做出的任何改变,但我不想再次克隆整个巨型 foo.git,只是丢失我所有的更改。我怎
我在我的电脑上开发代码,我的计算节点很少。 为了让我的程序保持同步,我决定使用 git。以前,我以一种单向模式使用它来“下推”从 PC 到计算节点的更改。但是时不时遇到计算节点特有的小bug,现场修复
虽然它似乎什么也没做,但它没有给出任何警告或错误消息。有什么想法吗? 最佳答案 来自 Git 源的注释: /* * Read a directory tree. We currently ignor
我知道如何为这样的 HTTPS 请求提供用户名和密码: git clone https://username:password@remote 但我想知道如何像这样向 Remote 提供用户名和密码:
Git GUI、Git Bash 和 Git CMD 之间有什么区别?我是初学者,为了进行安装,我发现自己通常同时使用 git bash 和 git CMD 最佳答案 Git CMD 就像使用 git
有人能告诉我git中文件索引被删除是什么意思吗?这些文件在我的 VS Code 中标记为红色,但我仍然可以修改文件并将更改推送到将反射(reflect)这些更改的远程存储库。我认为这一切都是在我使用命
我通过 git 子树将 GLFV 库添加到项目中,但出现此警告“看起来您的 git 安装或您的 git-subtree 安装已损坏”。还描述了几个原因,为什么这可能是: 如 git --exec-pa
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我一直在阅读一篇文章,作者在其中指示:在现有存储库中创建一个新存储库,并想知道这是否是他忽略的错误。稍后我会与他核实。 这些是我要检查的条件: 将现有目录制作成仓库的条件,并且已经 checkin 主
我确实在不同的计算机上处理相同的项目,我想知道是否有一种方法可以跟踪该 .git 文件夹,这样我就不必在所有本地文件中重新配置配置文件。 我将所有工作推送到 bitbucket。 最佳答案 不,没
这个问题在这里已经有了答案: How does git store files? (3 个答案) 关闭 9 年前。 我为我的许多项目创建了一个远程存储库,所以它是我的push 的目的地。与 git
应该如何在 git 中查看文件内容的完整历史记录? 一个文件在 git 中的历史很短,存储库通过 git-svn 同步,但在 svn 中的历史很长。 git 中的历史记录到达文件移动的位置。要查看历史
我是confused here ... 如何对修改后的文件进行git commit,以及如何对新文件进行git commit? 还有,你如何在git中单独提交文件? 最佳答案 git 提交过程分为两个
正在搜索 throw SO 来寻找答案。遇到这个似乎没有给出任何答案的旧线程。重新触发此线程,希望有人知道! 有人能告诉我 git subtree 和 git filter-branch 的区别吗?为
我想知道是否有一种方法可以避免在每个 Git 命令的开头键入单词 git。 如果有一种方法可以在打开命令提示符进入 “Git 模式” 后只使用一次 git 命令就好了。 例如: git> 之后,我们键
当您修改工作目录中的文件时,git 会告诉您使用“git add”暂存。 当您向工作目录添加新文件时,git 会告诉您使用“git add”开始跟踪。 我对这两个概念有点困惑,因为我假设跟踪文件的更改
为什么 git://有效 $ git clone git://github.com/schacon/grit.git Cloning into 'grit'... ... Checking conne
我在以下沙箱中练习 git:https://learngitbranching.js.org/?NODEMO 我在两个单独的 session 中运行了两组命令。第一组命令顺序如下: git clone
我是一名优秀的程序员,十分优秀!