しばらく放置していたこの nDiki のコード(DiKicker)に手を入れようと思うのだけれど、CVS で管理し続けるのもなぁと思い、これを機会に Git に移行させることにした。移行は cvs2git で。ローカルで自分だけでバージョン管理していたものだし、ブランチも切ってなくてタグを売ってあるだけなので一番ちょろいケースか。
Debian GNU/Linux sid 上に cvs2svn Debian パッケージをインストール。以下の手順でコンバートした。
Git リポジトリ上できちんとユーザ名とメールアドレスが入るようにしたいため、オプションファイルを使うようにする。
zcat /usr/share/doc/cvs2svn/examples/cvs2git-example.options.gz > cvs2git.options
でひな型をコピーして以下を書き換え。
以下のコマンドで。
cvs2git --options=cvs2git.options
mkdir <プロジェクト名> cd <プロジェクト名> git init cat ../cvs2svn-tmp/git-blob.dat ../cvs2svn-tmp/git-dump.dat | git fast-import
で QGit や git log などで、どのようにインポートされたかを確認。trunk のラインから、タグ毎に分岐したコミットができてそこに CVSROOT/ 以下が差分として入っているという形になっているのが特徴的。CVSROOT/ は特にいらないので、数が多くないし手でタグ打ち直すかなあという感じ。
git fast-import したままだと作業ツリーが空なので git checkout して master を checkout するなりすれば、後は普通に Git 上でバージョン管理をしていくことができる。
あっさり移行できたので一安心。
Git のトピックブランチで開発している時に、他のブランチを同時にチェックアウトしておきたくなる事がままある。
いったんテンポラリコミットを作ったり、あるいは stash したりして作業ツリーを保存してチェックアウトしなおして用事を済ませて元に戻すとかはやるのだけれど、ちょっと面倒。3番目のケースは同時にチェックアウトしたいのでこの方法だと駄目だし、4番目のケースだとしばらくそのままにしておかないのでもっと困る。
そのような時はローカルリポジトリから別ディレクトリへ clone して、そちらをサブで使ったりするんだけれど、サブの方でちょっと修正したりした際にローカル間で push/pull とかしなければならなくてこれまた面倒。
なんかいいのないかなと思ったら Git の contrib に git-new-workdir というのがあるのを昨日知った。
git-new-workdir . ../sub あるいは git new-workdir . ../sub
で作業ツリーを新しく作れる。/tmp/git/main を /tmp/git/sub に new-workdir すると sub の方の .git の中は
drwxr-xr-x 3 naney naney 4096 1月 30 00:37 . drwxr-xr-x 3 naney naney 4096 1月 30 00:37 .. -rw-r--r-- 1 naney naney 23 1月 30 00:37 HEAD lrwxrwxrwx 1 naney naney 25 1月 30 00:37 config -> /tmp/git/main/.git/config lrwxrwxrwx 1 naney naney 24 1月 30 00:37 hooks -> /tmp/git/main/.git/hooks -rw-r--r-- 1 naney naney 104 1月 30 00:37 index lrwxrwxrwx 1 naney naney 23 1月 30 00:37 info -> /tmp/git/main/.git/info drwxr-xr-x 2 naney naney 4096 1月 30 00:37 logs lrwxrwxrwx 1 naney naney 26 1月 30 00:37 objects -> /tmp/git/main/.git/objects lrwxrwxrwx 1 naney naney 30 1月 30 00:37 packed-refs -> /tmp/git/main/.git/packed-refs lrwxrwxrwx 1 naney naney 23 1月 30 00:37 refs -> /tmp/git/main/.git/refs lrwxrwxrwx 1 naney naney 26 1月 30 00:37 remotes -> /tmp/git/main/.git/remotes lrwxrwxrwx 1 naney naney 27 1月 30 00:37 rr-cache -> /tmp/git/main/.git/rr-cache lrwxrwxrwx 1 naney naney 22 1月 30 00:37 svn -> /tmp/git/main/.git/svn
のような感じで HEAD と index と logs/HEAD 以外はもとのローカルリポジトリへのシンボリックになっている。なので sub での checkout や index の Git 操作など以外は main の方へ反映されるようになっている。わざわざ push/pull しなくて良いのでこれは楽ちん。もちろん作業ツリーはそれぞれ独立しているので、例えばサブの方で Web サーバを起動しておいたり時間のかかるフルテストを走らせておくとかもできる。
ただ複数チェックアウトして作業していると、気がつくと Emacs で違うほうの作業ツリーのファイルを開いて編集していたりして「あれ? 変更したけれどなぜか反映されない……」とかやっちゃうので(実際やった)ちょっと注意が必要ではある。
git-new-workdir は contrib の中(Debian GNU/Linux sid だと /usr/share/doc/git/contrib/workdir/git-new-workdir)にあるみじかいシェルスクリプトなので適当に PATH の通ったところにコピーして実行権限を設定しておけば OK。
Git はこういうところがカワイイよね。
Markdown で書いているノートを「公開で作業する」というコンセプトで社内で公開するのに、 GitHub Enterprise Server (以下 GHE) の GitHub Pages を使ってみることにした。
静的サイトジェネレータ MkDocs には GitHub Pages にデプロイする機能が入っている。GHE 上のリポジトリに対しても問題なく動いた。
$ pip3 install mkdocs mkdocs-material
GHE 上で notes リポジトリを作成する。プライベートでも OK。
$ git clone git@example.com:Naney/notes.git $ cd notes $ git config user.name 'WATANABE Yoshimasa' $ git config user.email naney@example.com
MkDocs 設定ファイルと Markdown ファイルは既存の Obsidian vault の中にそれぞれ置いておき、シンボリックリンクしておくことにする。
$ ln -s /path/to/vault/Settings/mkdocs.yml
mkdocs.yml 内で以下を指定しておく。
docs_dir: /path/to/vault/notes
$ mkdocs serve
を実行し、 Web ブラウザで http://127.0.0.1:8000/ に接続しどのように表示するか確認する。
$ mkdocs gh-deploy
を実行すると gh-pages ブランチ上に静的サイトが生成され、リモートリポジトリに push してくれる。 GHE のリポジトリ側も自動で gh-pages ブランチを GitHub Pages で公開するように設定してくれる。びっくり。 https://example.com/pages/Naney/notes/ が公開 URL になる。
あとは Markdown ファイルを追加・更新・削除したら必要に応じて mkdocs serve で確認しつつ、 mkdocs gh-deploy していけば良い。
やってみると思ったよりお手軽だった。
プライベートリポジトリでも GitHub Enterprise Server の GitHub Pages サイトは公開となるので、組織内で限定公開するには境界型セキュリティに頼ることになる。ゼロトラストと考えるなら、漏洩してはならない情報を書かないよう注意して使うべきだ。
[ 組織内公開ワーキングノートサイト ] [ 公開で作業する ]
Naney (なにい) です。株式会社MIXIで SNS 事業の部長をしています。
※本サイトの内容は個人的見解であり所属組織とは関係ありません。