git + LaTeX工作流

我正在用LaTeX写一个很长的文档。我有我的工作电脑和笔记本电脑,我用这两台电脑工作。我需要保持两台计算机之间所有文件的同步,还想保留修改历史。我选择git作为我的DVCS,并且我将存储库托管在我的服务器上。我也使用Kile + Okular来进行编辑。Kile没有集成的git插件。我也没有和任何人合作写这篇文章。我也在考虑在codaset上放另一个私有存储库,如果我的服务器由于某种原因无法访问。

在这种情况下,推荐的工作流实践是什么?如何在这个工作方案中进行分支?是否有一种方法可以比较同一文件的两个版本?用藏东西怎么样?

95456 次浏览

我也有类似的工作流程。即使一次只处理一个分支,我发现对于不同的工作状态使用单独的分支是有益的。例如,想象你把一份不错的论文草稿寄给你的导师。然后,你有了一个疯狂的想法!你想要开始改变一些核心概念,重新工作一些主要部分,等等。所以你开始工作。你的主分支总是处于“可发布”状态(或者和你当时的状态一样接近)。所以,当你的其他分支很疯狂,有一些巨大的变化时,如果另一个出版商想看看你有什么,或者你是一个提交会议的学生,主分支总是可发布的,随时可以发布(或准备向你的导师展示)。如果你的博士导师想在早上第一件事就是看到草稿,是的,你可以隐藏/阶段/提交你当前的更改,使用标签或搜索日志,但为什么不保持单独的分支呢?

假设你的主分支拥有你工作的“可发布”状态。你现在想把它提交给几个同行评审的期刊,每个期刊对相同的内容都有不同的格式要求,你希望他们会对你如何编辑论文以适应他们的读者提出一些不同的小批评,等等。您可以轻松地为每个日志创建一个分支,对日志进行特定的更改,提交,并在收到反馈后对每个单独的分支进行更改。

我也使用Dropbox和git创建了你上面描述的系统。您可以在dropbox文件夹中创建一个基本的存储库。然后,您可以从任何一台计算机推/拉到您的dropbox,以保持最新的所有端点。这个系统通常只在合作者数量很少的情况下才有效,因为如果人们试图同时推送到dropbox回购,就有可能发生腐败。

从技术上讲,您也可以在dropbox文件夹中保留一个存储库,并从那里完成所有工作。然而,我不鼓励这样做,因为人们提到dropbox在同步不断变化的文件(获取内部文件)时遇到了一些麻烦。

对LaTeX工作流的更改:

高效管理Git+LaTeX工作流的第一步是对您的LaTeX习惯做一些更改。

  • 对于初学者,把每个句子单独写在一行上。Git被写入版本控制源代码,其中每一行都是不同的,具有特定的用途。当您在LaTeX中编写文档时,您经常从段落的角度考虑问题,并将其编写为一个自由流动的文档。但是,在git中,对段落中一个单词的更改将被记录为对整个段落的更改。

    一个解决方案是使用git diff --color-words(参见我对类似问题的回答如何使用Mercurial进行文本文档的版本控制?,其中我展示了一个例子)。然而,我必须强调,分割成不同的行是一个更好的选择(在回答中我只是顺便提到了它),因为我发现它会导致非常小的合并冲突。

  • 如果你需要查看代码diff,请使用Git的原生diff。要查看任意两次提交(版本)之间的差异,可以使用每个提交的__abc0。更多细节请参见文档显示在两个修订之间更改了哪些文件

    另一方面,如果你需要查看你的格式化输出的diff,请使用latexdiff,这是一个优秀的实用程序(用perl编写),它接受两个latex文件,并在pdf中生成一个整洁的差分输出(图片来源):

    < img src = " https://i.stack.imgur.com/7i08Q.png " alt = " / >

    你可以使用git-latexdiffgitlatexdiff(如果需要,还可以加上latexpand)组合在一个命令中(例如git latexdiff HEAD^来查看你的工作树和倒数第二次提交之间的差异)。

  • 如果你在LaTeX中编写一个长文档,我建议将不同的章节拆分到各自的文件中并在主文件中使用\include{file}命令调用它们。通过这种方式,你可以更容易地编辑你作品的本地化部分,也更容易进行版本控制,因为你知道每个章节都做了哪些更改,而不是必须从一个大文件的日志中找出它。

高效使用Git:

  • < p > 使用分支!。也许没有更好的建议了。我发现分支对于跟踪“不同的想法”非常有帮助。对于文本或“不同的国家”;工作的。master分支应该是你工作的主体,在它最新的“准备出版”中;状态,即,如果在所有分支中,如果有一个你愿意把你的名字放在上面,它应该是主分支。

    如果你是一个研究生,分支也是有帮助的。任何一个研究生都可以证明,导师肯定会有很多纠正,其中大多数你都不同意。然而,你可能会期望至少暂时改变它们,即使它们在讨论之后会被恢复。因此在这种情况下,你可以创建一个新的分支advisor,并根据他们的喜好进行更改,同时维护你自己的开发分支。然后,您可以将两者合并并选择您需要的内容。

  • 我还建议将每个部分分割成不同的分支,只关注与你所在分支对应的部分。当你创建一个新的部分或虚拟部分时,你的初始提交(你的选择,真的)衍生一个分支。当你不在它的分支上时,抵制编辑不同部分(比如,3)的冲动。如果您需要编辑,请提交这个,然后在分支之前签出另一个。我发现这非常有用,因为它在自己的分支中保存了部分的历史,并且还告诉您(从树中)一些部分的年龄。也许你在第3部分中添加了一些需要调整到第5部分的材料……当然,这些很有可能在仔细阅读时观察到,但我发现一眼看到这些很有帮助,这样如果我对某个部分感到厌倦了,我就可以切换到其他部分。

    下面是我最近一篇论文中的一个分支和合并的例子(我在OS X上使用SourceTree,在Linux上使用Git)。你可能会注意到,我不是世界上最频繁的提交者,也没有一直留下有用的评论,但这并不是你不遵循这些好习惯的理由。主要的信息是在分支机构工作是有帮助的。我的想法、想法和发展是非线性的,但我可以通过分支跟踪它们,并在我满意的时候将它们合并(我也有其他无法引导的分支,后来被删除了)。我也可以&;tag"如果它们有意义,就提交(例如,向期刊初次投稿/修改后的投稿/等)。在这里,我把它标记为“版本1”,这是目前草案的位置。这棵树代表着一周的工作。

    .

  • 另一件有用的事情是将文档范围内的更改(例如将所有地方的\alpha更改为\beta)单独提交。这样,您就可以恢复更改,而不必同时回滚其他内容(使用git有很多方法可以做到这一点,但是,如果您可以避免它,为什么不呢?)序言的补充部分也是如此。

  • 使用远程回购,定期将您的更改推向上游。有了像GitHub和Bitbucket这样的免费服务提供商(它们都允许你用免费账户创建私人回购),如果你正在使用Git/Mercurial,没有理由不使用这些服务。至少,可以将其视为LaTeX文件的次要备份(我希望您有一个主备份!),以及允许您从不同机器上的位置继续编辑的服务。

我试图将其作为bash函数实现,我已将其包含在~/.bashrc中,以使其始终可用。

function git-latexdiff {
if [[ $# != 2 ]];
then
printf "\tusage: git-latexdiff <file> <back-revision>  \n";
elif [[ $2 -lt 0 ]];
then
printf "\t<Back-revision> must be positive\n";
else
dire=$(dirname $PWD/$1);
based=$(git rev-parse --show-toplevel);
git show HEAD~$2:$(echo $dire| sed 's!'$(echo $based)'/!!')/$1 > $1_diff.tmp;
latexdiff $1 $1_diff.tmp > $1_diff.tex;
pdflatex $1_diff.tex;
okular $1_diff.pdf;
rm $1_diff*;
fi;
}
注意,这个函数需要安装latexdiff(并在路径上找到)。 对于它来说,找到pdflatexokular也很重要 第一种是我的优先处理LaTeX的方式,所以你也可以把它改为latex。 第二个是我的PDF阅读器,我猜你会想在gnome下使用evince,或一些其他解决方案

这是一个快速版本,只考虑单个文档,这是因为使用git,您将花费大量时间和精力跟踪多个文件的LaTeX文档。你也可以让git来完成这个任务,但如果你愿意,你也可以继续使用\include

使用这个版本差异,如果你在windows上,没有安装,只是一个简单的bat脚本 它在windows10上完美地工作,miktex2.9:

https://github.com/redreamality/git-latexdiff