git + LaTeX工作流程


270

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

在这种情况下,建议的工作流程做法是什么?如何在此工作方案中设置分支?有没有办法比较同一文件的两个版本?那用藏起来怎么样?

Answers:


390

对LaTeX工作流程的更改:

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

  • 对于初学者,请在单独的行上写下每个句子。Git被编写为版本控制源代码,其中每一行都是不同的并且有特定的用途。当您在LaTeX中编写文档时,通常会以段落的方式思考并将其编写为自由流动的文档。但是,在git中,对段落中单个单词的更改会记录为对整个段落的更改。

    一种解决方案是使用git diff --color-words(在示例中,请参见我对类似问题的回答)。但是,我必须强调,将行拆分为一个更好的选择(我只是在传递答案时提到了它),因为我发现它导致的合并冲突非常小。

  • 如果您需要查看代码diff,请使用git的本机diff。要查看两个任意提交(版本)之间的差异,可以使用sha每个提交的s来实现。请参阅文档以获取更多详细信息以及此问题

    另一方面,如果您需要查看格式化输出的差异,请使用latexdiff它是一个出色的实用程序(用perl编写),该实用程序可以接收两个乳胶文件,并以pdf格式生成整齐的差异输出,如下所示(图像来源):

    您可以使用git-latexdiff在单个命令中组合gitlatexdifflatexpand如果需要,可以加上)(例如,查看工作树和最后一个提交之间的差异)。git latexdiff HEAD^

  • 如果您要使用乳胶编写较长的文档,建议将不同的章节拆分为各自的文件,然后使用\include{file}命令在主文件中调用它们。这样,您就更容易编辑工作的本地化部分,并且也使版本控制更容易,因为您知道对每一章进行了哪些更改,而不必从一个大的日志中找出来文件。

有效地使用git:

  • 使用分支!。我可能没有更好的建议。我发现分支机构对于跟踪文本的“不同想法”或作品的“不同状态”非常有用。该master分支应该是你工作的主体,在其最新的“准备发布”状态,即,如果所有的分支,如果有一个你愿意把你的名字就可以了,它应该是主分支。

    如果您是研究生,分支机构也非常有帮助。正如任何研究生所证明的那样,顾问必定会做出许多更正,而您大多数都不同意。但是,您可能希望暂时至少更改它们,即使在讨论之后稍后将它们还原。因此,在这种情况下,您可以创建一个新分支advisor并对其喜好进行更改,同时保持自己的开发分支。然后,您可以将两者合并,然后选择所需的东西。

  • 我还建议将每个部分分成一个不同的分支,并只关注与您所在的分支相对应的部分。在创建新节时生成分支,在进行首次提交时生成伪段(实际上是您的选择)。当您不在其分支上时,请不要编辑其他部分(例如3)。如果需要编辑,请提交一个,然后在分支之前签出另一个。我发现这非常有帮助,因为它可以将该节的历史记录保留在自己的分支中,并且一目了然(从树上)告诉您某个节的年龄。也许您已经在第3节中添加了需要对第5节进行调整的内容...当然,在仔细阅读的过程中很可能会发现这些内容,但是我发现一目了然会有所帮助,以便我可以如果我换档

    这是我最近发表的论文中分支和合并的示例(我在OS X上使用SourceTree,在Linux上从命令行使用git)。您可能会注意到,我不是世界上最频繁的提交者,也不总是留下有用的评论,但这并不是您不遵循这些良好习惯的理由。最主要的提示是,在分支机构中工作会有所帮助。我的思想,想法和发展是非线性进行的,但是我可以通过分支跟踪它们,并在满意时将它们合并(我还有其他分支,后来无处可去)。我也可以“标记”提交(如果它们表示某些意思)(例如,初次提交到期刊/修订的提交/等)。在这里,我将其标记为“版本1”,这是到目前为止的草案。这棵树代表一个星期

    在此处输入图片说明

  • 另一有用的操作是使文档范围的更改(例如更改\alpha\beta任何地方)自行提交。这样,您可以还原更改而不必回滚其他任何内容(有多种方法可以使用git进行此操作,但是,嘿,如果可以避免的话,为什么不这样做呢?)。对于前言的补充也是如此。

  • 使用远程存储库,并定期将更改推送到上游。使用github和bitbucket之类的免费服务提供商(后者甚至允许您使用免费帐户创建私有存储库),如果您正在使用git / mercurial,则没有理由不使用它们。至少,可以将其视为乳胶文件的辅助备份(希望您有一个主备份!),并且该服务可以让您从其他计算机上继续编辑。


6
@迭戈:一开始确实需要一点时间来适应,因为您的头脑只是想不断地阅读它。但是,它实际上更容易,因为我(和大多数人)查看的是纯净的乳胶输出,以查看句子是否有意义并对其进行校对。使用这些中断对输出没有影响,并且使差异变得更加容易。另外,您可以将乳胶输出链接到源文件,因此,如果发现错误或错字,只需单击它,它将带您直接到达源中的相应点。
abcd

1
我使用类似的方法,但是您如何处理图形或其他二进制文件,git也可以处理它们,或者在没有版本跟踪的情况下,存储库中是否应包含其他方法处理文件?
liborw

6
这些是方便的技巧,除了我看不到的用法:每节一个分支。您可以轻松查看每个文件的更改,那么为什么通过添加额外的分隔层来增加工作流程的复杂性呢?git [log|show|add] some_file.tex全部工作,无需在此处添加常量分支切换。如果需要,您仍然可以自行提交每个文件。
rubenvb

1
@rubenvb如果要将每个部分拆分为不同的文件,那么可以。通常,我(以及学术界的很多人)每篇文章只使用一个tex文件。单独的文件对于书籍/主题是有意义的,其中每一章都有大量材料。当然,这些只是建议……每个人都应根据适合自己工作流程的条件选择和拒绝提示:)
abcd 2013年

2
@yoda啊,我明白了。是的,那才有意义。无论如何,我倾向于在日记本上强制多个tex文件;-)。
rubenvb

12

我也有类似的工作流程。即使一次要处理一个分支,我发现为不同的工作状态设置单独的分支也是有益的。例如,想象一下将一份好的草稿发送给顾问。然后,您得到一个疯狂的主意!您想开始更改一些核心概念,对一些主要部分进行重做,等等。因此您开始分支并开始工作。您的主分支始终处于“可释放”状态(或与您当时的状态一样近)。因此,尽管您的其他分支机构很疯狂并且发生了巨大变化,但是如果另一个发布者想要查看您拥有的内容,或者您​​是一个正在提交会议的学生,则主分支机构总是可释放的,随时可以使用(或准备展示您的顾问)。如果您的博士导师想早上看草稿,

假设您的主分支处于工作的“可释放”状态。现在,您想将其提交给几本经过同行评审的期刊,每本期刊对相同内容的格式都有不同的要求,并且期望它们对如何编辑论文以适合其读者等提出不同的批评。您可以轻松地为每个日记创建一个分支,进行日记特定的更改,提交,并在收到反馈后在每个单独的分支上进行更改。

我还使用了Dropbox和git来创建您上面描述的系统。您可以在Dropbox文件夹中创建准系统存储库。然后,您可以从任一台计算机上推/拉到您的保管箱,以保持最新状态。该系统通常仅在协作者数量很少时才能使用,因为如果人们尝试同时推送到保管箱回购协议,则可能会导致损坏。

从技术上讲,您也可以只将一个存储库保留在dropbox文件夹中,然后从那里进行所有工作。但是,我不鼓励这样做,因为人们已经提到Dropbox在同步不断变化的文件(gits内部文件)时遇到一些麻烦。


3
只需注意,通常一次将论文提交给多个期刊/会议进行同行评审是不道德的!
超常

7

我试图将其实现为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安装(并在路径中找到)。找到pdflatex并找到它也很重要okular

第一种是我偏爱的处理LaTeX的方法,因此您也可以将latex其修改。第二个是我的PDF阅读器,我想您要evince在gnome或其他解决方案下使用。

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


请记住,LaTeX引用不适用于生成的可视化文件。并且在功能的末尾删除了生成的文件。如我所说,这是一个快速版本。
Rafareino 2012年


@juandesant是什么意思?
拉法雷诺2014年

1
抱歉,@ Rafareino,我的意思是“ git helper”:git helper是可以由git进行某些操作的工具。在这种情况下,只要配置正确,就可以使用latexdiff命令行工具git diff
juandesant 2015年

3

另一个选择是使用Authorea,它是某种Github用于科学论文。Authorea中的每篇文章都是Git仓库。而且您撰写的LaTeX会呈现为HTML5(以及您撰写时的PDF)。


这是一个古老的话题,其想法是将所有内容托管在内部。Authorea很酷,但不是我想要的。
伊万

5
您应该明确说明自己是Authorea联合创始人
joelb

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.