waveさんの技術日誌

wave1008の日記の新館です。

ドキュメントのバージョン管理はSVNとGit、どっちがいいの?

SVNからGitへの移行を考えたんだけど…

10年ほど前にバージョン管理ソフトウェアとしてSVN(TortoiseSVN)を使い始めました。現在はドキュメントもソースコードもバージョン管理なしの世界には戻れないなと感じています。世の中的にGitが流行っているのは知ってたんだけど、職場でもGitに移行するって話は具体化しなかったし、いろいろ不便はあったけどSVNに慣れちゃってたんで、Gitの導入はしてませんでした。久しぶりに技術ブログを書くにあたって、サンプルコードを共有するならGitHubがいいかなーと思い、ようやく使い始めたところです。

なるほど、GitはオリジナルのリポジトリをローカルPCにコピー(クローン)して、ローカルで一旦コミットしてから、オリジナルにプッシュするという二段構えの構成になっている。個人の作業は成果物が完成するまでローカルで進めるので、マージの衝突頻度が緩和されるんですね。また、ローカルで履歴管理できるので、SVNで不満だった「作業中のものを適宜コミットして履歴管理に乗せたいけど、未完成のものをコミットすると他の開発者に迷惑をかける」って問題が解決されてます。SVNだと履歴管理したいなーってタイミングでパッチファイルを作って、SVNの一時フォルダにコミットすることで履歴管理の代用とするなんてダサいことをやってました。TFSだとシェルブ機能で一時保存できるらしいので、あれはあれで便利そうですけどね。

なんか、Gitいいかもって思ったので、ソースコード管理だけでなくTortoiseGit使ってドキュメント管理もSVNから移行しようかなってちょっと考えたんだけど、結論から言うと思い留まりました。GitはSVNと比較すると、ドキュメント管理に向いていないと思います。理由は以下。

 

個人的にGitでのドキュメント管理を避ける理由

  1. 空フォルダを作成できない
  2. ファイルをロックできない
  3. プッシュしないと中央のリポジトリに反映できない

 

1.空フォルダを作成できない

Gitは空のフォルダを作成することができません。理由は知りません。この制約を回避するために、なんでもいいからファイルを一つ置くということが必要です。一般には.gitkeepという名前の空ファイルを置くのがプラクティスなんだそうです。

ドキュメント管理するのに何で空フォルダを使いたいのかって?それは、プロジェクト開始時にドキュメントの保管場所としてフォルダ階層を一式登録し、そこに置くようにルール化したいからです。よくありますよね、こんなの。

  • 01.プロジェクト計画
  • 02.要求分析
  • 03.要件定義
  • 04.外部設計
  • ...

フォルダ階層の末端に.gitkeepなんてファイル置きたくないです。

 

2.ファイルをロックできない

SVNのファイルロック機能は、ファイルを読み取り専用にすることでロックされている状態を擬似的に実現しているだけの簡易なものですが、無いよりもマシです。企画書や報告書なんかを複数人で編集する際、ロックを取得してから(読み取り専用を書き込み可能にしてから)編集するというワークフローになっていると、編集者どうしが自然に協調して作業することができます。

一方、Gitにはロック機能がありません。そもそも分散型なので、排他機能を実現しようがありません。ドキュメント管理はSVNのような集中型が向いていると思います。

 

3.プッシュしないと中央のリポジトリに反映できない

これが一番問題な気がします。AさんとBさんが同じ報告書.pptxを編集していたとして、Aさんが編集した結果をBさんが取得しようと思ったら、Gitだと以下の手順になります。

  1. Aさんが報告書.pptxをコミット(ローカル)
  2. Aさんが報告書.pptxをプッシュ
  3. Bさんが報告書.pptxをプル

 

Gitのことをよく理解して使いこなしているエンジニアならともかく、ドキュメントを中心に仕事をしている人なら、コミットしたらそこで安心して、プッシュするのを忘れますよね。で、「企画書コミットしましたー」「プルしても落ちてこねえよ。ちゃんとプッシュしたのかよ」なんて会話が想像できますよね。

そもそも、テキストファイル以外のドキュメントはソースコードのようにはマージできないから、pptxとかxlsxとかの非テキストファイルはコミットとプッシュを二段階に分ける必要ないんですよね。コミットした時点で衝突がわかればそれでいい。集中型のSVNはそのような挙動なわけで、そこからあえて分散型のGitのフローに移行するメリットはないんじゃないかと思います。

 

以上のことから、ドキュメント管理はSVNのほうがいいと思うんです。サーバー管理がめんどくさいかもしれないけど、ドキュメントはSVNで、ソースコードはGitでやるのがよいと思われ。実践してないから知らんけど。