howm+git でメモを同期

複数の PC で howm メモを同期するために今までは手動で rsync していたが、
面倒なので自動化して併せて git で管理するようにしてみた。

以下に、自宅内サーバ Remote に公開リポジトリを用意し、
2 台のローカルマシン LocalA, LocalB で howm メモを同期する環境を
作成した方法をメモしておく。

git 環境の導入

参考にしたサイト:
せっかちな人のための git 入門 – git をインストールし、共同で開発できる環境を整えるまで

まず、 LocalA で git リポジトリを作成した。 howm のディレクトリは ~/work/howm にあるものとする。

LocalA:~$ cd work/howm
LocalA:~/work/howm$ git init
LocalA:~/work/howm$ git add .
LocalA:~/work/howm$ git commit -m 'first commit'

git init でリポジトリを作成し、 git add . でカレントディレクトリ以下の全てのファイルをリポジトリに追加、
git commit でコミットメッセージを入力してコミットする。

次にサーバ Remote で公開リポジトリを準備する。

Remote:~$ cd work
Remote:~/work$ mkdir howm.git
Remote:~/work$ cd howm.git
Remote:~/work/howm.git$ git --bare init

–bare オプションを付けて git init すると公開リポジトリになるようだ。

そして localA のローカルリポジトリ (master ブランチ) を Remote のリモートリポジトリ (origin ブランチ) に反映させる。

LocalA:~/work/howm$ git remote add origin ssh://Remote/home/user/work/howm.git
LocalA:~/work/howm$ git push origin master

git push origin master は master を origin にプッシュするという意味。

さて、Remote のリポジトリから LocalB にリポジトリをコピー (clone) してみる。

LocalB:$ cd work
LocalB:~/work$ git clone ssh://Remote/home/user/work/howm.git

すると howm ディレクトリが生成され、その中にファイルがコピーされる。

LocalA, LocalB のリポジトリを Remote のリポジトリに反映するには以下のコマンドを実行すればよい。

$ cd ~/work/howm
$ git add new-file
$ git commit -m 'comment message'
$ git push origin master

逆に、Remote のリポジトリをローカルに反映するには以下のコマンドを実行すればよい。

$ cd ~/work/howm
$ git pull origin master

git push と git pull では引数 (origin と master) を省略できる。
(LocalA だと省略できなかった。 git clone すれば出来るようになった。)

howm メモ自動同期設定

howm を開いたり、保存したときに自動的に同期するための設定を行う。

参考にしたサイト:
2009-09-09 howmのメモファイルをSubversionを使って同期をとる方法(その2)

まず、シェルスクリプトを作成する。

~/work/howm/.howm-mode-on.sh:

#!/bin/sh

cd $HOME/work/howm/
git pull

~/work/howm/.howm-after-save.sh:

#!/bin/sh

cd $HOME/work/howm/
git pull
git add .
git commit -m "`date "+%F %T"`"
git push

これらのシェルスクリプトを、howm-mode を開いたとき、メニューを更新したとき、メモを保存したときに実行する hook を .emacs に追記する。

.emacs:

(eval-after-load "howm"
  '(progn
     (add-hook 'howm-mode-hook
               (lambda ()
                 (shell-command-to-string
                  (concat (expand-file-name ".howm-mode-on.sh" howm-directory) " &>/dev/null &"))))
     (add-hook 'howm-menu-hook
               (lambda ()
                 (shell-command-to-string
                  (concat (expand-file-name ".howm-mode-on.sh" howm-directory) " &>/dev/null &"))))
     (add-hook 'howm-after-save-hook
               (lambda ()
                 (shell-command-to-string
                  (concat (expand-file-name ".howm-after-save.sh" howm-directory) " &>/dev/null &"))))
     ))

以上の設定で、howm メモを LocalA, LocalB 間で自動に同期できるようになった。

ところで、シェルスクリプト書いて気づいたけど sh (というか dash) って pushd, popd 無いんだね。