git + LaTeX工作stream程

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

这种情况下推荐的工作stream程是什么? 在这个工作scheme中如何安装分支? 有没有办法比较同一个文件的两个版本? 如何使用存储?

更改您的LaTeX工作stream程:

有效pipe理git + latex工作stream程的第一步是对LaTeX习惯进行一些更改。

  • 对于初学者来说, 把每个句子写在一个单独的行上 。 Git被写入到版本控制源代码中,每行都是不同的,并有特定的目的。 当您在LaTeX中编写文档时,您经常会根据段落来考虑,并将其写成自由stream动的文档。 但是,在git中,段落中单个单词的更改会被logging为对整个段落的更改。

    一个解决scheme是使用git diff --color-words ( 参考我的答案,在一个类似的问题中,我将展示一个示例)。 但是,我必须强调,分割成单独的行是一个更好的select(我只是在提及这个答案时提到过),因为我发现它会导致非常小的合并冲突。

  • 如果您需要查看代码差异,请使用git的本地比较。 要查看两个任意提交(版本)之间的差异,可以使用每个提交的内容来完成。 有关更多详细信息以及此问题,请参阅文档

    另一方面,如果您需要查看格式化输出的差异,请使用latexdiff ,这是一个优秀的实用程序(用perl编写),需要两个latex文件,并以pdfforms生成一个整齐的diff输出( 图像源 ):

    你可以在一个命令中使用git-latexdiff来结合gitlatexdiff (如果需要的话加上latexpand )(例如git latexdiff HEAD^来查看你的工作树和最后一个提交之间的区别)。

  • 如果你正在用latex写一个长文档,我build议把不同的章节分成自己的文件,并用\include{file}命令在主文件中调用它们。 这样一来,编辑本地化的工作就变得更容易了,而且版本控制也更容易,因为您知道每章都做了哪些更改,而不必从一个大的日志中弄清楚文件。

高效使用git:

  • 使用分支! 。 也许没有更好的build议,我可以给。 我发现分支机构对logging文本或工作“不同状态”的“不同想法”非常有帮助。 master分支应该是你最主要的“准备发布”状态的工作主体,也就是说,如果所有的分支,如果有一个你愿意把你的名字,它应该是主分支。

    如果你是研究生,分支也是非常有帮助的。 任何一个研究生都会certificate,这位顾问肯定会有很多更正,其中大部分你都不同意。 然而,即使在讨论之后,你也可以期望尽快地改变它们。 因此,在这种情况下,您可以创build一个新的分支advisor ,并根据自己的喜好进行更改,同时维护您自己的开发分支。 然后,你可以合并这两个樱桃select你所需要的。

  • 我也build议将每个部分分成不同的分支,并只关注与你所在分支相对应的部分。 当你进行初始提交时(你的select,当你创build一个新的部分或虚拟的部分)时产生一个分支。 当你不在其分支上时,抵制编辑另一部分(比如3)的冲动。 如果你需要编辑,提交这个,然后在分支之前检出另一个。 我觉得这非常有帮助,因为它保留了该部分在自己的分支的历史,也告诉你(从树上)一些部分是多大年纪。 也许你已经在第3部分添加了需要调整到第5部分的材料……当然,在仔细阅读的过程中,这些很可能会被观察到,但是我发现这一眼就能看出来,如果我厌倦了一个部分换档。

    这里有一个我最近的论文(我使用OS X上的SourceTree和Linux上的命令行上的git)的分支和合并的例子。 你可能会注意到,我并不是世界上最常见的提交者,也不会一直留下有用的评论,但是没有理由不遵循这些良好的习惯。 主要的外卖信息是在分支机构工作是有帮助的。 我的想法,想法和发展是非线性的,但是我可以通过分支来追踪它们,当我满意的时候我也可以合并它们(我也有其他的分支机构,这些分支机构在任何地方都被删除了)。 我也可以“标记”提交,如果他们的意思是什么(例如,最初提交的期刊/修改提交/等)。 在这里,我把它标记为“版本1”,这是草稿现在的位置。 树代表了一个星期的工作价值。

    在这里输入图像说明

  • 另一个有用的事情是做文档的广泛改变(比如把\alpha \beta到处),自己提交。 这样,你可以恢复变化,而不必回滚别的东西(有办法,你可以用git来做到这一点,但是,嘿,如果你可以避免它,那么为什么不呢?)。 序言的补充也是如此。

  • 使用远程回购,并定期向上游推送您的更改。 有了像github和bitbucket这样的免费服务提供商(后者甚至允许你使用免费账户来创build私人回购站),如果你使用git / mercurial,没有理由不使用这些服务。 至less,将其视为辅助备份(我希望你有一个主要的备份!)为您的乳胶文件和一个服务,使您可以继续编辑从你留在不同的机器上。

我也有类似的工作stream程。 即使一个分支正在进行,我觉得在不同的工作状态下有不同的分支是有好处的。 例如,想象一下,把你的论文的一个很好的草稿发给你的顾问。 那么,你有一个疯狂的想法! 你想开始改变一些核心概念,重新做一些主要的部分等等,所以你分支开始工作。 您的主分支始终处于“可释放”状态(或者与您在那一刻接近)。 所以,当你的其他分支疯狂并且有一些剧烈的变化时,如果另一个出版商想要看看你有什么,或者你是一个学生提交会议,主分支总是可以释放,准备去(或准备显示你的顾问)。 如果你的博士导师想在早上看第一件事,是的,你可以隐藏/登台/提交你当前的修改,使用标签或search日志,但是为什么不保留单独的分支?

假设你的主分支有你的工作的“可释放”状态。 你现在想把它提交给几个同行评审的期刊,每个期刊对同样的内容都有不同的格式要求,你希望他们回来几个小小的批评,关于如何编辑文章以适应读者等等。您可以轻松地为每本期刊创build分支机构,进行期刊特定更改,提交,以及在收到反馈意见后,在每个单独的分支机构上进行更改。

我也用Dropbox和git来创build你上面描述的系统。 您可以在保pipe箱文件夹中创build一个裸机存储库。 然后,您可以从任一台计算机上推/拉到您的保pipe箱,以保持最新状态。 这个系统通常只在合作者数量较less的情况下才起作用,因为如果人们试图同时推入Dropbox回购站,那么存在腐败的可能性。

您可以在技术上只保留一个存储库在保pipe箱文件夹,并从那里做所有的工作。 然而,我会劝阻这个,因为人们已经提到,Dropbox在同步不断变化的文件(gits内部文件)时遇到一些麻烦。

我试图实现这个作为一个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; } 

请注意,此function需要安装latexdiff (并在path中find)。 findpdflatexokular也是很重要的。

首先是我最喜欢的方式来处理乳胶,所以你可以把它变成latex 。 第二个是我的PDF阅读器,我打算在gnome下使用evince ,或者其他解决scheme。

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

另一个select是使用Authorea这是一些Github的科学论文。 Authorea中的每篇文章都是一个Git回购。 你编写的LaTeX被渲染成HTML5(当你编译的时候也是PDF)。

使用这个版本比较 ,如果你在窗口,没有安装,只是一个简单的bat脚本它完美的Windows10,miktex2.9:

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