292

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

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

4

4 に答える 4

424

LaTeXワークフローの変更:

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

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

    1つの解決策は、を使用することですgit diff --color-wordsテキストドキュメントのバージョン管理にMercurialを使用する方法は?例を示しています)。ただし、マージの競合が非常に少ないことがわかったため、別々の行に分割する方がはるかに優れたオプションであることを強調する必要があります(その回答を渡すときにのみ言及しました)。

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

    一方、フォーマットされた出力latexdiffの差分を確認する必要がある場合は、2つのラテックスファイルを取得し、次のようにpdfで適切な差分出力を生成する優れたユーティリティ(perlで記述)を使用します(画像ソース):

    git-latexdiffgitを使用して1つのコマンドでとlatexdiff(およびlatexpand必要に応じて)を組み合わせることができます(たとえば、ワークツリーと最後の1つのコミットとの差分を表示するため)。git latexdiff HEAD^

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

Gitを効率的に使用する:

  • ブランチを使用してください!。私が与えることができるより良いアドバイスはおそらくありません。ブランチは、テキストまたは作業の「さまざまな状態」の「さまざまなアイデア」を追跡するのに非常に役立つことがわかりました。masterブランチは、最新の「公開準備完了」状態の作業の本体である必要があります。つまり、すべてのブランチの中で、名前を付けてもよいブランチがある場合は、マスターブランチである必要があります。

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

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

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

  • もう1つの便利な方法は、ドキュメント全体の変更(どこにでも変更\alphaするなど\beta)を自分でコミットすることです。そうすれば、他の何かをロールバックすることなく変更を元に戻すことができます(gitを使用してこれを行う方法はありますが、回避できるのであれば、なぜですか?)。前文への追加についても同じことが言えます。

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

于 2011-05-31T16:09:29.083 に答える
14

私も同様のワークフローを持っています。一度に1つのブランチで作業を行っていますが、作業の状態ごとに別々のブランチを用意することは有益だと思います。たとえば、あなたの論文の良いラフドラフトをあなたのアドバイザーに送ることを想像してみてください。次に、あなたはクレイジーなアイデアを得る!いくつかのコアコンセプトの変更を開始したり、いくつかの主要なセクションを作り直したりする必要があります。そこで、分岐して作業を開始します。マスターブランチは常に「解放可能な」状態にあります(またはその瞬間にできるだけ近くなります)。したがって、他のブランチがおかしくなり、大幅な変更が加えられている間、別の発行元があなたの持っているものを確認したい場合、またはあなたが会議に提出している学生である場合、マスターブランチは常に解放可能で、準備ができています(またはアドバイザー)。博士課程の指導教官が朝一番にドラフトを見たい場合は、

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

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

技術的には、ドロップボックスフォルダ内に1つのリポジトリを保持し、そこからすべての作業を行うこともできます。ただし、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

1つ目は LaTeXを処理するための私の好みの方法です。そのため、LaTeXを変更することもできlatexます。2つ目は私のPDFリーダーです。gnomeevinceまたはその他のソリューションで使用することをお勧めします。

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

于 2012-06-02T00:54:52.723 に答える
0

Windowsを使用している場合は、これをバージョンdiffに使用します。分割払いはなく、単純なbatスクリプトです。windows10、miktex2.9で完全に機能します。

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

于 2017-01-30T03:22:22.657 に答える