292

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

在这种情况下,推荐的工作流程实践是什么?如何在这个工作方案中安装分支?有没有办法比较同一文件的两个版本?使用藏匿点怎么样?

4

4 回答 4

424

对 LaTeX 工作流程的更改:

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

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

    一种解决方案是使用git diff --color-words(请参阅我对类似问题的回答如何使用 Mercurial 进行文本文档的版本控制?我在这里展示了一个示例)。但是,我必须强调,拆分成单独的行是一个更好的选择(我只是在那个答案中提到它),因为我发现它会导致非常小的合并冲突。

  • 如果需要查看代码差异,请使用 Git 的原生差异。要查看两个任意提交(版本)之间的差异,您可以使用sha每个提交的 s 来查看。请参阅文档以获取更多详细信息以及显示在两个修订版之间更改了哪些文件

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

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

  • 如果您正在用 LaTeX 编写一个长文档,我建议将不同的章节拆分为它们自己的文件\include{file},并使用命令在主文件中调用它们。这样,您可以更轻松地编辑工作的本地化部分,并且版本控制也更容易,因为您知道对每一章进行了哪些更改,而不必从一个大的日志中弄清楚文件。

有效地使用 Git:

  • 使用树枝!. 我可能没有更好的建议了。我发现分支对于跟踪文本的“不同想法”或工作的“不同状态”非常有帮助。分支应该是你的master主要工作,处于其最新的“准备发布”状态,即,如果在所有分支中,如果有一个你愿意在上面写上你的名字,它应该是主分支。

    如果您是研究生,分支机构也非常有帮助。正如任何研究生都会证明的那样,顾问肯定会有很多更正,其中大部分是你不同意的。然而,您可能希望至少暂时更改它们,即使它们稍后在讨论后被恢复。因此,在这种情况下,您可以创建一个新分支advisor并根据自己的喜好进行更改,同时维护您自己的开发分支。然后,您可以合并两者并挑选您需要的东西。

  • 我还建议将每个部分拆分为不同的分支,并仅关注与您所在的分支相对应的部分。当你创建一个新的部分时产生一个分支,或者当你进行初始提交时产生一个虚拟部分(你的选择,真的)。当您不在其分支时,抵制编辑不同部分(例如,3)的冲动。如果您需要编辑,请提交这个,然后在分支之前签出另一个。我觉得这很有帮助,因为它将部分的历史保存在自己的分支中,并且还一目了然地告诉你(从树中)某个部分的历史。也许您在第 3 部分中添加了需要调整到第 5 部分的材料……当然,这些内容很可能在仔细阅读时会被观察到,但我发现看一眼这些内容会很有帮助,这样我就可以换档了如果我'

    这是我最近一篇论文中的分支和合并示例(我在 OS X 上使用 SourceTree,在 Linux 上使用命令行中的 Git)。你可能会注意到我不是世界上最频繁的提交者,我也不会一直留下有用的评论,但这不是你不遵循这些好习惯的理由。主要的外卖信息是在分支机构工作是有帮助的。我的想法、想法和发展是非线性进行的,但我可以通过分支跟踪它们,并在我满意时合并它们(我还有其他分支,但后来被删除了)。我也可以“标记”提交,如果它们意味着什么(例如,对期刊的初始提交/修订提交/等)。在这里,我将它标记为“版本 1”,这是草稿目前的位置。这棵树代表一个星期'

  • 另一件有用的事情是自己进行文档范围的更改(例如更改\alpha\beta无处不在)。这样,您可以还原更改而不必回滚其他内容(您可以使用 git 执行此操作,但是嘿,如果您可以避免它,那为什么不呢?)。序言的补充也是如此。

  • 使用远程仓库并定期将您的更改推送到上游。使用 GitHub 和 Bitbucket 等免费服务提供商(两者都允许您使用免费帐户创建私有存储库),如果您使用 Git/Mercurial,则没有理由不使用它们。至少,将它视为您的 LaTeX 文件的辅助备份(我希望您有一个主备份!),以及一项允许您从离开在另一台机器上的位置继续编辑的服务。

于 2011-05-31T16:09:29.083 回答
14

我也有类似的工作流程。即使一次只处理一个分支,我发现为不同的工作状态设置单独的分支是有益的。例如,想象一下将你的论文草稿发送给你的导师。然后,你有一个疯狂的想法!你想开始改变一些核心概念,重做一些主要部分,等等。所以你分支并开始工作。您的 master 分支始终处于“可发布”状态(或与您当时一样接近)。所以当你的另一个分支很疯狂并且有一些剧烈的变化时,如果另一个发布者想看看你有什么,或者你是一个提交会议的学生,主分支总是可以发布的,准备好了(或准备展示你的顾问)。如果你的博士导师想在早上第一时间看到草稿,

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

我还使用 Dropbox 和 git 创建了您上面描述的系统。您可以在 Dropbox 文件夹中创建一个基本存储库。然后,您可以从任何一台计算机推/拉到您的保管箱,以随时保持最新状态。该系统通常仅在协作者数量较少的情况下才有效,因为如果人们同时尝试推送到 Dropbox 存储库,则可能会发生损坏。

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

于 2011-05-31T14:28:20.857 回答
9

我试图将其实现为 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

于 2012-06-02T00:54:52.723 回答
0

如果您在 Windows 上,请将此用于版本差异bat,无需分期付款,只需一个简单的脚本即可在 windows10、miktex2.9 上完美运行:

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

于 2017-01-30T03:22:22.657 回答