git + LaTeXワークフロー


270

LaTeXで非常に長いドキュメントを書いています。私は仕事用のコンピューターとラップトップを持っていて、両方で作業しています。2台のコンピューター間ですべてのファイルの同期を維持する必要があります。また、変更履歴も保持したいと考えています。私はDVCSとしてgitを選択し、サーバーでリポジトリをホストしています。また、編集にはKile + Okularを使用しています。Kileにはgitプラグインが統合されていません。また、私はこのテキストについて誰とも協力していません。また、何らかの理由で私のサーバーにアクセスできない場合は、codasetに別のプライベートリポジトリを配置することも検討しています。

この場合の推奨ワークフロープラクティスは何ですか?この作業スキームに分岐をどのように適合させることができますか?同じファイルの2つのバージョンを比較する方法はありますか?スタッシュの使用についてはどうですか?

回答:


390

LaTeXワークフローの変更:

Git + LaTeXワークフローを効率的に管理するための最初のステップは、LaTeXの習慣にいくつかの変更を加えることです。

  • まず、各文を別々の行書きます。Gitはバージョン管理のソースコードで記述されており、各行は個別であり、特定の目的があります。LaTeXでドキュメントを書くとき、段落の観点から考え、自由に流れるドキュメントとして書くことがよくあります。ただし、gitでは、段落内の1つの単語に対する変更は、段落全体に対する変更として記録されます。

    1つの解決策は、使用することですgit diff --color-words(同様の質問への私の回答を参照してください。テキストドキュメントのバージョン管理にMercurialを使用する方法?例を示します)。ただし、マージの競合が非常に少ないことがわかったため、個別の行に分割する方がはるかに優れたオプションであることを強調しなければなりません(その回答を渡す際に言及しただけです)。

  • コードの差分を確認する必要がある場合は、Gitのネイティブの差分を使用してください。2つの任意のコミット(バージョン)の違いを確認するには、sha各コミットのsを使用して確認できます。詳細および2つのリビジョン間で変更されたファイルの表示については、ドキュメントを参照してください

    一方、あなたはあなたの差分を見てする必要がある場合は、フォーマットされた出力、使用latexdiff2つのラテックスファイルを受け取り、このようなPDFファイルできちんとした差分を取っ出力(生成(perlで書かれた)優れたユーティリティです画像ソースを):

    あなたは組み合わせることができますgitし、latexdiff(プラスlatexpand必要に応じて)を使用して、単一のコマンドではgit-latexdiff(例えばgit latexdiff HEAD^、あなたのworktreeとの間の差分を表示するには、最後の-が、-1はコミット)。

  • LaTeXで長いドキュメントを作成している場合は、さまざまな章を独自のファイルに分割し、\include{file}コマンドを使用してメインファイルでそれらを呼び出すことをお勧めます。このようにすると、1つの大きなログから把握する必要がなく、各章にどのような変更が加えられたかがわかるため、作業のローカライズされた部分を編集しやすくなり、バージョン管理も簡単になります。ファイル。

Gitを効率的に使用する:

  • ブランチを使用してください!。おそらくこれ以上のアドバイスはありません。ブランチは、テキストの「異なるアイデア」や作品の「異なる状態」を追跡するのに非常に役立つことがわかりました。のmaster支店は、もし全ての枝の、状態、すなわち「を公開する準備ができて、」あなたはそれに名前を入れて喜んでいることがある場合、それはマスターブランチである必要があり、その最新で、仕事のあなたの本体でなければなりません。

    大学院生の場合も支部は非常に役立ちます。大学院生が証明するように、アドバイザーは多くの修正をする必要がありますが、そのほとんどはあなたが同意しません。ただし、ディスカッション後に後で元に戻されたとしても、当面の間は少なくともそれらを変更することが期待される場合があります。そのため、そのような場合は、新しいブランチadvisorを作成して好みに変更を加えると同時に、独自の開発ブランチを維持することができます。次に、2つをマージして、必要なものを選択することができます。

  • また、各セクションを別のブランチに分割し、現在のブランチに対応するセクションのみに焦点を当てることをお勧めします。新しいセクションを作成するときにブランチを生成するか、最初のコミット(実際に選択)を行うときにダミーセクションを生成します。ブランチにいないときに別のセクション(たとえば3)を編集したいという衝動に抵抗します。編集する必要がある場合は、これをコミットしてから、分岐する前にもう一方をチェックアウトします。これは、セクションの履歴を独自のブランチに保持し、一部のセクションの古さを一目で(ツリーから)通知するため、非常に役立ちます。おそらく、セクション5を微調整する必要のある資料をセクション3に追加しました…もちろん、これらはおそらく、注意深く読んでいる間に観察されますが、ギアをシフトできるように、これを一目で確認すると役立つと思いますもし私が'

    これは最近の論文からのブランチとマージの例です(私はOS XではSourceTreeを、LinuxではコマンドラインからGitを使用しています)。私が世界で最も頻繁なコミッターではないことや、いつも有益なコメントを残していないことにお気づきでしょうが、それはあなたがこれらの良い習慣を守らない理由にはなりません。主な要点は、ブランチでの作業が役立つことです。私の考え、アイデア、開発は非線形に進行しますが、ブランチを介してそれらを追跡し、満足するときにそれらをマージできます(後で削除されたどこにもつながらない他のブランチもありました)。コミットが何かを意味する場合は、「タグ付け」することもできます(たとえば、ジャーナルへの最初の提出/改訂された提出など)。ここでは、「バージョン1」というタグを付けました。これが現在のドラフトの場所です。ツリーは1週間を表します '

  • 別の有用なことは、ドキュメント全体の変更(どこにでも変更\alphaするなど\beta)を自分でコミットすることです。そうすれば、何か他のものと一緒にロールバックしなくても、変更を元に戻すことができます(gitを使用してこれを行う方法はありますが、回避できる場合は、その理由を教えてください)。プリアンブルへの追加についても同様です。

  • リモートリポジトリを使用して、変更を定期的にアップストリームにプッシュします。GitHubやBitbucketなどの無料のサービスプロバイダー(どちらも無料のアカウントでプライベートリポジトリを作成できる)を使用しているため、Git / Mercurialを使用している場合にこれらを使用しない理由はありません。少なくとも、それをLaTeXファイルのセカンダリバックアップ(プライマリがあることを願っています!)と考え、別のマシンに残ったところから編集を続けることができるようにします。


6
@Diego:あなたの心はそれを継続的に読みたいだけなので、最初は少し慣れる必要がありました。しかし、実際には私(そしてほとんどの人)はきちんとしたlatex出力を見て、文章が意味をなすかどうかを確認し、それを読んで証明するのでもっと簡単です。これらのブレークを使用しても出力には影響がなく、比較がはるかに簡単になります。また、latex出力をソースファイルにリンクすることができるため、エラーやタイプミスを見つけた場合は、それをクリックするだけで、ソース内の対応するポイントに直接移動できます。
abcd

1
私は同様のアプローチを使用していますが、Figureまたは他のバイナリファイルをどのように処理しますか、それらをgitで処理できますか、またはバージョン追跡なしでリポジトリに含める必要があるファイルに対して他のアプローチがありますか?
liborw

6
これらは便利なヒントですが、私には見られないもの、つまりセクションごとのブランチがあります。ファイルごとに簡単に変更を確認できるので、分離の層を追加してワークフローの複雑さを増すのはなぜですか。git [log|show|add] some_file.texすべてが機能します。ここに定数ブランチ切り替えを追加する必要はありません。必要に応じて、各ファイルを個別にコミットすることもできます。
rubenvb 2013

1
@rubenvb各セクションを異なるファイルに分割する場合は、そうです。通常(そして学界の多くの人々)は、記事ごとに1つのtexファイルのみを扱います。個々のファイルは、各章に大量の資料が含まれている本/論文には意味があります。もちろん、これらは単なる提案にすぎません...それぞれのワークフローに適したものに応じてヒントを選択し、拒否する必要があります:)
abcd

2
@yodaああ、なるほど。はい、それは理にかなっています。とにかくジャーナルに複数のtexファイルを強制する傾向があります;-)。
rubenvb 2013

12

同様のワークフローがあります。一度に1つのブランチで作業している場合でも、作業の状態ごとに別々のブランチを用意すると便利です。たとえば、論文の大まかなドラフトをアドバイザーに送信するとします。その後、あなたはクレイジーなアイデアを手に入れます!いくつかのコアコンセプトの変更を開始したり、いくつかの主要なセクションなどを作り直したりしたいので、分岐して作業を開始します。あなたのマスターブランチは常に「解放可能な」状態にあります(またはその瞬間にいるのと同じくらい近くにあります)。他のブランチがクレイジーで大幅な変更がある場合、別のパブリッシャーがあなたが持っているものを見たい場合、またはあなたが学生が会議に提出している場合、マスターブランチは常に解放可能であり、準備ができています(またはアドバイザー)。PhDアドバイザーが朝一番にドラフトを見たい場合は、

あなたのマスターブランチがあなたの仕事の「解放可能な」状態を持っているとしましょう。ここで、同じコンテンツに対して異なるフォーマット要件を持ついくつかの査読付きジャーナルに提出したいと考えています。読者に合うように論文を編集する方法について、いくつかの小さな批判が寄せられることを期待しています。ジャーナルごとにブランチを簡単に作成し、ジャーナル固有の変更を加えて送信し、フィードバックを受け取ったら、個別のブランチごとに変更を加えることができます。

Dropboxとgitを使用して、上記のシステムを作成しました。Dropboxフォルダーに必要最小限のリポジトリを作成できます。その後、いずれかのコンピューターからドロップボックスにプッシュ/プルして、すべての端で最新の状態を維持できます。人々が同時にDropboxリポジトリにプッシュしようとすると破損する可能性があるため、このシステムは通常、共同編集者の数が少ない場合にのみ機能します。

技術的には、ドロップボックスフォルダー内に1つのリポジトリを保持し、そこからすべての作業を行うこともできます。ただし、dropboxは常に変化するファイル(gits内部ファイル)の同期に問題があると人々が言っ​​たので、これはお勧めしません。


3
ピアレビュー用の論文を同時に複数のジャーナル/会議に提出することは、通常、倫理的とは見なされないことに注意してください。
supernormalが

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インストールする必要があります(そしてパス上にあります)。それを見つけるためにすることも重要であるpdflatexokular

1つ目は LaTeXを処理するための私の推奨される方法latexです。2つ目は私のPDFリーダーです。gnome evinceやその他の解決策の下で使用したいと思います。

これはクイックバージョンであり、単一のドキュメントを念頭に置いて作成されています。これは、gitを使用すると、マルチファイルのLaTeXドキュメントの追跡に多くの時間と労力を費やすためです。gitにこのタスクを実行させることもできますが、必要に応じて、引き続き使用することもできます。\include


LaTeX参照は生成された視覚化に適合しないことを覚えておいてください。また、生成されたファイルは関数の最後で削除されます。私が言ったように、それはクイックバージョンです。
Rafareino

1
gifヘルパーと呼ばれるlatexdiffを使用するための提案は、git with Usinglatexdiff
juandesant

「gifヘルパー」、@ juandesantとはどういう意味ですか?
Rafareino

1
申し訳ありません、@ Rafareino、私は「gitヘルパー」を意味しました:gitヘルパーは、いくつかの操作のためにgitによって呼び出すことができるツールです。この場合、適切に構成すれば、latexdiffコマンドラインツールを使用するだけで使用git diffできます。
juandesant、2015年

3

別のオプションは、科学論文用のGithubの一種であるAuthoreaを使用することです。Authoreaのすべての記事はGitリポジトリです。そして、あなたが作成したLaTeXはHTML5にレンダリングされます(コンパイル時にPDFも同様です)。


これは古いスレッドであり、アイデアはすべてをオンプレミスでホストすることです。Authoreaはクールですが、私が探していたものではありません。
Ivan

5
Authoreaの共同創設者であることを明確にする必要があります
joelb

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.