[解決済み】git + LaTeX ワークフロー
質問
私はLaTeXで非常に長い文書を書いています。仕事用のコンピュータとラップトップを持っていて、両方で作業しています。2つのコンピュータ間ですべてのファイルを同期させる必要があり、また、改訂履歴も残しておきたいと考えています。私はDVCSとしてgitを選択し、私のサーバーにリポジトリをホストしています。また、編集にはKile + Okularを使用しています。Kileにはgitのプラグインが統合されていません。また、このテキストでは誰とも共同作業をしていません。もし何らかの理由で私のサーバーにアクセスできない場合は、codasetに別のプライベートリポジトリを置くことも考えています。
この場合、どのようなワークフローの実践が推奨されますか?この作業スキームでブランチはどのようにフィットさせることができますか?同じファイルの2つのバージョンを比較する方法はありますか?スタッシュの使用についてはどうでしょうか?
解決方法は?
LaTeXのワークフローを変更する。
Git+LaTeX ワークフローを効率的に管理するための最初のステップは、あなたの LaTeX の習慣を少し変えることです。
-
手始めに。 文章を一行ごとに書く . Gitはソースコードをバージョン管理するために書かれたもので、それぞれの行は区別され、特定の目的を持っています。LaTeXで文書を書くときは、段落単位で考え、自由な流れの文書として書くことが多いでしょう。しかし、gitでは、段落の中の一つの単語に対する変更は、段落全体に対する変更として記録されます。
一つの解決策として
git diff --color-words
(同様の質問に対する私の回答参照 テキストドキュメントのバージョン管理にMercurialを使うには? をご覧ください(例)。しかし、行を分割することは、より良い選択肢であることを強調しなければなりません (この回答ではほんの少し触れただけです)。なぜなら、その方がマージの衝突が非常に少なくなることがわかったからです。 -
コードの差分を見る必要がある場合は、Git のネイティブ diff を使ってください。任意のふたつのコミット(バージョン)の差分を見るためには
sha
をそれぞれのコミットの をご覧ください。 ドキュメント の詳細と、さらに 2つのリビジョン間でどのファイルが変更されたかを表示する .一方、もしあなたの フォーマットされた出力 を使用します。
latexdiff
は、2つのLatexファイルを受け取って、以下のようにpdfできちんと差分出力する優れたユーティリティです(Perlで書かれています)。 イメージソース ):を組み合わせることができます。
git
とlatexdiff
(さらにlatexpand
を使い、1つのコマンドで git-latexdiff (例git latexdiff HEAD^
を実行すると、ワークツリーと直近のコミットとの差分が表示されます)。 -
LaTeXで長いドキュメントを書くなら 異なる章をそれぞれのファイルに分割する。 を使ってメインファイルの中で呼び出します。
\include{file}
コマンドを使用します。こうすることで、ローカライズされた部分を編集しやすくなりますし、バージョン管理もしやすくなります。1つの大きなファイルのログから把握するのではなく、各章にどんな変更がなされたかを知ることができるからです。
Gitを効率的に使う。
-
ブランチを使おう . これ以上のアドバイスはないでしょう。私は、テキストに対する「異なるアイデア」や、作品の「異なる状態」を記録するために、ブランチが非常に役立つことを発見しました。その
master
つまり、すべてのブランチの中で、自分の名前を載せてもいいと思うものがあれば、それを master ブランチとすべきなのです。また、ブランチは 極めて 大学院生であればなおさらです。大学院生なら誰もが認めるように、指導教官は数多くの修正をするはずで、そのほとんどは自分が納得できないものです。それでも、あなたは以下のことを期待されるかもしれません。 少なくとも 後で議論して元に戻されたとしても、とりあえず変えてみる。ですから、そのような場合には、新しいブランチを作成することができます。
advisor
を作成し、彼らの好みに合わせて変更すると同時に、自分自身の開発用ブランチを維持します。そして、その2つをマージして、必要なものを選び出すことができるのです。 -
また、各セクションを別のブランチに分割し、自分がいるブランチに対応するセクションのみにフォーカスすることをお勧めします。新しいセクションを作成するときにブランチを生成するか、最初のコミットを行うときにダミーセクションを生成します (実際には、あなたの選択です)。ブランチにいないときに別のセクション (たとえば 3) を編集したい衝動に駆られないようにしましょう。編集する必要がある場合は、こちらをコミットし、ブランチする前にもう一方をチェックアウトしてください。この方法は、セクションの履歴をそのブランチに残し、また、あるセクションがどのくらい古いかを(ツリーから)一目でわかるので、とても便利だと思います。もちろん、これらはじっくり読んでいるうちにわかることですが、一目でわかると、あるセクションに飽きてきたときにギアを入れ替えられるので便利です。
これは、最近の論文のブランチとマージの例です(OS XではSourceTree、LinuxではコマンドラインからGitを使用しています)。私が世界一頻繁にコミットしているわけでも、常に有益なコメントを残しているわけでもないことにお気づきでしょう。しかし、だからといってその良い習慣を守らないという理由にはなりません。主なメッセージは、ブランチで作業することは有用であるということです。私の思考、アイデア、開発は非線形に進みますが、ブランチを通じてそれらを追跡し、満足したときにマージすることができます(私はどこにもつながらないブランチも持っていましたが、後に削除されました)。また、コミットに何か意味がある場合は、"tag" を付けることができます(例:ジャーナルへの最初の投稿/改訂された投稿/など)。ここでは、quot;version1" というタグを付けていますが、これは現時点での草稿の位置です。ツリーは1週間分の作業を表しています。
-
もうひとつ便利なのは、ドキュメント全体の変更(たとえば
\alpha
を\beta
を含む)を単独でコミットします。そうすることで、他のものを一緒にロールバックすることなく変更を取り消すことができます (git を使ってこれを行う方法もありますが、避けられるのならそうしたほうがよいでしょう)。前文への追加も同様です。 -
リモートレポを使用し、定期的に変更を上流にプッシュする。GitHubやBitbucket(どちらも無料アカウントでプライベートリポジトリを作成できます)などの無料サービスプロバイダーがあるので、Git/Mercurialを使っているのであればこれらを使わない理由はないでしょう。少なくとも、LaTeXファイルの二次バックアップ(一次バックアップがあることを祈ります!)として、また、別のマシンで残したところから編集を続けることができるサービスとして検討してみてください。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] masterブランチと'origin/master'が分岐している、'undiverge'ブランチの方法は?
-
[解決済み】以下の追跡されていないワーキングツリーファイルは、マージによって上書きされますが、私は気にしません。
-
[解決済み】ファイルのアンリンクに失敗しました。もう一度試してみるべきですか?
-
[解決済み】Git サブモジュール head 'reference is not a tree' エラー
-
[解決済み】Git Extensions。Win32 エラー 487: cygwinのヒープ用に領域を確保できなかった、Win32エラー0
-
[解決済み] 複数のコミットをチェリーピックする方法
-
[解決済み] SourceTree error:1407742E:SSLルーチン:SSL23_GET_SERVER_HELLO:tlsv1警告プロトコルバージョン
-
[解決済み] git status に fatal: bad object HEAD と表示される。
-
[解決済み] エラーです。リベースを使用してプルできません。あなたはステージングされていない変更を持っています
-
[解決済み] 2つのリビジョン間でどのファイルが変更されたかを表示する