texファイルをgitで管理する

背景

研究で文章を書く際にはtexを使うことが多いと思います。 毎日texの文章を変更し続けていると、以前何を書き換えたのか忘れてしまったり、昔の状態に戻したいと思ったりすることが多々あります。そのときのために、逐一texファイルをそのままバックアップして管理するのは、ディスク容量的にもあまりよろしくありません。

そこで、gitを使って、ファイルの差分を管理することで、そのような自体にうまく対応してやろうというのが今回のねらいです。 gitで管理しておくと、任意のコミットの時点に一瞬でファイルを復元できますし、バックアップのファイル容量も抑えられます。 同じ名前のファイルが複数作られることもないので、ディレクトリの管理も非常にシンプルになります。

一般的には、gitというと、GitHubやBitbucketなどのサービスを使って複数人での共同開発を円滑に進めるためのものというふうに考えると思います。 このとき、リモートリポジトリとして、外部のサーバにファイルをアップロードしなければならないため、最新の研究に関する論文などはアップロードするべきではないかもしれません。 一番いい方法は、研究室内のサーバにGitLabなどを使ってgitのリモートリポジトリを作ってしまうことですが、やり方がわからないという場合は、gitのローカルリポジトリのみ使うという方法も考えられます。 もちろん、複数人でtexファイルを変更するときは困りますが、基本的に自分一人で書き換えるので大丈夫です。

今回は、texをgitで管理するための使い方を紹介するというのが目標です。

texのdiffをとる

ちなみに、latexdiffというツールが存在して、これを使うと2つのtexファイルの差分をPDFとして見ることができます。 なので、今日変更を加えた最新バージョンと、昨日のバージョンのdiffをPDFで表示させることもできます。 このとき、今ローカルにあるtexファイルと、あるブランチにおけるtexファイルに対してlatexdiffを行わなければいけません。 そのため、少し複雑なことをしなければなりませんが、shell scriptを書いたので、それを使うと簡単にdiffのPDFを作ることができます。

これで毎日、どこを書き換えたのかすぐに出すことができるので、進捗報告が相当楽になります。

texのためのgit

gitに関して、すごくわかりやすい説明のwebページはたくさんあるので、まずはそこを見てください。 例えば以下のリンクが参考になります。今回はローカルリポジトリのみを使うということを想定しているので、 すべてを覚える必要はなく、とりあえず以下のものだけ使えるようになれば十分です。

backlog.com

覚えておきたいgitの用語

  • add
  • commit
  • branch
  • checkout
  • merge

望ましいgit Flow

さて、gitの基本的なイメージが掴めたら、どのように作業をするべきかについて説明します。

github.com

の中身をcloneもしくはダウンロードしてください。 このリポジトリの中には、texのための.gitignoreとlatexdiffするときのshell scriptが入ってます。 このダウンロードしたディレクトリの中で, texファイルを編集することにします。

masterブランチは、最新の状態が維持されるように管理します。 そして、ブランチ名は日付にしておくのがベターかと思います。 基本的な流れとしては、一日が始まったら、その日の名前のブランチを作成し、作業をしたら適宜コミットして、最後にmasterブランチとマージして帰宅するというのがおすすめです。 例えばtest.texという名前のファイルを管理するのならば、以下のような流れでコマンドを入力していけばよいです。

git checkout -b "today"
------test.texを編集する---------
git add test.tex
git commit -m "comment"
------test.texを編集する---------
git add test.tex
git commit -m "Revise Finished"
git checkout master
git merge "today"

1日1コミットしかしないのではなく、キリがいいときに、適宜コミットしておく癖をつけておくと良いです。 最後に、masterブランチをマージする前に、今日の成果のdiffをlatexdiffを用いて作る方法を紹介します。

masterブランチのファイルとlatexdiffする

現在のローカルにあるfilename.texと、masterブランチ時点でのfilename.texのlatexdiffをとるためには、以下を実行します。

./make_diff.sh filename.tex

これで、diffディレクトリの下に、diff.texという名前のファイルが生成されるので、そのtexファイルからpdfを作れば終わりです。 ちなみに、中でやっていることはそんなに難しくありません。

git show master:fiilename.tex

とすると、masterブランチのfilename.texの中身を見ることができるので、リダイレクトして、一度ファイルを生成してから現在のブランチのファイルとdiffをとったあと消すということをやってます。それだけです。 ただ、毎回同じことを書くのは時間の無駄なので、このようにshell scriptを書くことで、一行で実行できます。 もし、よかったら使ってやってください。僕も数週間試してみていますが、いい感じです。 みんなtexもgitで管理するべき。