README.md

vcsh - $HOME のためのバージョン管理システム - $HOME に複数の Git リポジトリを置くために

訳者より

この訳文について、誤植や誤訳などの問題があった場合、その責任は私(fumiu)にあります。
以下の日本語訳に関するご連絡は作者の RichiH 氏ではなく私へメール(fumiu at raythebm.net)して下さるようお願いいたします。

目次

  1. 30 秒 クイックスタートガイド
  2. ソフトの紹介
  3. 利用例
  4. 概要
  5. 使い始めるには
  6. 連絡先

30 秒 クイックスタートガイド

vcsh には、かなり大量のドキュメントが付いており、そのコンセプトを説明するには git の内部動作について細部に至るまで触れる必要がありますが、 vcsh を使い始める事自体はとても簡単です。

例として、あなたが自分用の vim 設定をバージョン管理する場合を考えてみましょう:

vcsh init vim
vcsh vim add ~/.vimrc ~/.vim
vcsh vim commit -m 'Initial commit of my Vim configuration'
# もちろん、ファイル群はリモートのリポジトリに push できます
vcsh vim remote add origin <remote>
vcsh vim push -u origin master
# さあ、これで思う存分ファイルを変更してコミットできるようになりました
vcsh vim push

もし上の手順が通常の git 操作と ほとんど同じ ように見えたとしたら、それは偶然ではありません; そうなるようにデザインしたのです。

ソフトの紹介

vcsh は、ただ一つのディレクトリ内で複数の Git リポジトリを維持できるようにします。
デフォルト設定では vcsh によって維持されている全ての Git リポジトリは、 実際のファイルを $HOME に保存します。 もちろん、お望みなら別の動作に変更できます。
これらのリポジトリは各々の作業ツリーを、お互いが干渉したり破壊したりせずに維持されます。 つまり、あなたはアプリケーションやアプリケーションファミリーごと -例えば zsh, vim, ssh など- に 個別のリポジトリを持てるのです。
更に、異なるパソコン(あるいは異なるユーザ)用に clone する設定用リポジトリの組み合わせをカスタマイズできます。あなたが使いたいなら何処ででも、複数あるリポジトリから幾つかを 抜き出したり混ぜ合わせたりして利用できるのです。
例えば、サーバマシンでは mplayer 用の設定を利用しないことや、 個人用と仕事用のマシンにおいて root と 他のユーザ間で違う ssh 設定を 使うようにすること等が挙げられます。

大抵の UNIX ベースのシステムには vcsh のパッケージがあります。
もしパッケージが存在しなければ、 INSTALL.md を読んでインストール手順を進めるか、 PACKAGING.md に従ってパッケージを自作するかして下さい。 首尾よく vcsh パッケージを作成できたら、そのパッケージ用のブランチを 上流リポジトリに取り込ませて欲しいので、我々に連絡してもらえると助かります。

Talks

vcsh の動作を理解するのに、ドキュメントを読むよりも スライドや動画の方が分かりやすい場合もあります。
スライド、動画、その他の情報については 作者の talk ページ にそれぞれのリンクがあります。

利用例

vcsh リポジトリの利用方法には 3通りあります。 このセクションでは一番簡単で単純な方法のみを説明します。
他の二つの方法を必要とするような高度な利用法も多少はあるのですが、今のところは心配しなくても大丈夫です。 わざわざ残り二つの方法を試してみようなどと奇特な事を考えなければ、幸せでいられるでしょう。
なお、 vcsh entervcsh run に関しては後のセクションで触れています。

タスク コマンド
"vim" という名前のリポジトリを新規作成する vcsh init vim
既存のリポジトリを clone する vcsh clone <remote> <repository_name>
リポジトリ "vim" にファイルを追加する vcsh vim add ~/.vimrc ~/.vim
vcsh vim commit -m 'Update Vim configuration'
リポジトリ "vim" にリモートリポジトリを追加で設定する vcsh vim remote add origin <remote>
vcsh vim push origin master:master
vcsh vim branch --track master origin/master
リポジトリ "vim" の内容をリモートに push する vcsh vim push
リポジトリ "vim" についてリモートから pull する vcsh vim pull
全てのリポジトリについて変更されたファイルのステータスを表示する vcsh status
全てのリポジトリについて(それぞれ) pull する vcsh pull
全てのリポジトリについて(それぞれ) push する vcsh push

概要

無から vcsh へ

あなたは自分の設定ファイルの作成に多大な労力を費したことでしょう。 そして、その設定が保護され、かつ配布できたら、どんなに素晴しいだろうと考えませんでしたか?

ほとんどの人は $HOME 自体にバージョン管理用リポジトリを作成する事から始め、 そこに全ての設定ファイル(よく dotfile と呼ばれます)を追加していきます。 (人によっては他のファイルが含まれることもあります)
もちろんこれでも管理できますが、複数のパソコンに対応しようとした途端に厄介な事になります。

次に考えられるのは、例えば ~/.dotfiles のようなディレクトリの中に 単一目的リポジトリをそれぞれ作成し、その中のファイルへのリンクを $HOME に 作ることです。
この方法は、各ホストで特定のリポジトリのみをチェックアウトすればよいという柔軟性を提供します。
その一方、このアプローチにはリポジトリごとに手作業で clone とリンクの作成を 行わなければならないという欠点があります。

vcsh は、このアプローチをもう一歩進めたものを提供します。
ある隠しディレクトリの中に単一目的リポジトリを保管して、それらを使うところまでは同じです。
しかしながら $HOME にそれらのリンクを作成するのではなく、 対象のファイルそのものを $HOME ディレクトリに設置します。

vcsh によって任意個の異なるリポジトリを $HOME に置けるため、 あなたは近いうちに沢山のリポジトリを持つことになるでしょう。

vcsh 他多数のリポジトリを管理するため、我々は mr の利用を推奨します。
mr は多種のバージョン管理システムにおけるデータの push や pull について 面倒をみてくれるのです。

vcshmr (複数種のリポジトリを管理するためのツール) を視野に入れてデザインされたため、 この二つの組み合わせは、とても相性が良いです。
mr はネイティブに vcsh リポジトリをサポートしており、 また vcsh にとって mr は管理対象の一つなのです。 このため、新しいパソコンを設定するのも容易なことです。 標準的なインストール完了から、文字通り 5分以内に設定を完了できます。

以上が mr の出自の話です。 mr の利用は技術的にはオプションとなっていますが、以降で示されている システムを構成する重要な一部分なのです。

デフォルトのディレクトリ構造

以下はよく見られるディレクトリ構造を図にしたものです。

$HOME
    |-- $XDG_CONFIG_HOME (defaults to $HOME/.config)
    |   |-- mr
    |   |   |-- available.d
    |   |   |   |-- zsh.vcsh
    |   |   |   |-- gitconfigs.vcsh
    |   |   |   |-- lftp.vcsh
    |   |   |   |-- offlineimap.vcsh
    |   |   |   |-- s3cmd.vcsh
    |   |   |   |-- tmux.vcsh
    |   |   |   |-- vim.vcsh
    |   |   |   |-- vimperator.vcsh
    |   |   |   `-- snippets.git
    |   |   `-- config.d
    |   |       |-- zsh.vcsh        -> ../available.d/zsh.vcsh
    |   |       |-- gitconfigs.vcsh -> ../available.d/gitconfigs.vcsh
    |   |       |-- tmux.vcsh       -> ../available.d/tmux.vcsh
    |   |       `-- vim.vcsh        -> ../available.d/vim.vcsh
    |   `-- vcsh
    |       |-- config
    |       `-- repo.d
    |           |-- zsh.git  -----------+
    |           |-- gitconfigs.git      |
    |           |-- tmux.git            |
    |           `-- vim.git             |
    |-- [...]                           |
    |-- .zshrc   <----------------------+
    |-- .gitignore.d
    |   `-- zsh
    |-- .mrconfig
    `-- .mrtrust

available.d

$XDG_CONFIG_HOME/mr/available.d に見られるファイルは mr の設定ファイルです。 それぞれは一つのリポジトリを管理(checkout, update など)するためのコマンドを含んでいます。
例では vcsh リポジトリの設定ファイルは名前の末尾が .vcsh となり、git リポジトリでは 末尾が .git となり、他のバージョン管理システムの場合も同様になっています。 このようなルールは一例であり、自分で好きな規則を決めるのが良いでしょう。
例えば、以下は私の zshrc リポジトリに対して読み込み専用アクセスを設定する zsh.vcsh の内容です。 当然ながら、この設定では私のリポジトリを利用しているため、他の人の push は動作しません。 これはあくまでデモ用ですから。 もちろん、このリポジトリを自分用に fork した後に、そちらを clone して利用するのは賢い選択ですね。

[$XDG_CONFIG_HOME/vcsh/repo.d/zsh.git]
checkout = vcsh clone 'git://github.com/RichiH/zshrc.git' zsh
update   = vcsh zsh pull
push     = vcsh zsh push
status   = vcsh zsh status
gc       = vcsh zsh gc

config.d

$XDG_CONFIG_HOME/mr/available.d には 利用可能な全ての リポジトリが含まれます。 一方、 mr/config.d にあるのは mr で利用されるファイルやリンクのみです。 上の例では、 zsh, gitconfigs, tmux, vim のリポジトリのみがチェックアウトされます。 $HOME で単に mr update と打つと、config.d にリストされている 4つだけが clone もしくは update されます。

~/.mrconfig

最後に ~/.mrconfig ですが、このファイルは上の設定ファイル同士をたばねて、 mr up 等のコマンドで便利に全てのリポジトリを管理できるようにしています。
このファイルは以下のようになります:

[DEFAULT]
include = cat ${XDG_CONFIG_HOME:-$HOME/.config}/mr/config.d/*

repo.d

$XDG_CONFIG_HOME/vcsh/repo.d は vcsh の管理下にある全ての git リポジトリが置かれるディレクトリです。 これらのワーキングツリーは $HOME になるよう設定されているので、各リポジトリ内のファイルは $HOME ディレクトリに置かれます。
なお、当然ながら mr がこのようなディレクトリ構成で動くのは、このドキュメントに従って(上のように)設定された場合です。

vcsh は作成しようとするファイルが既に存在しないか確かめます。 もし存在していた場合には vcsh は警告を表示して終了します。 古いファイルをどこかへ移動するなどしてから再試行してください。
また、その後に(先ほど移動した)ローカル設定をマージして vcsh foo push で push もできます。

新しいホストへ引っ越す

詳しく説明すれば、次のような手順で所望の設定を新しいホストへ移動できます。

  1. mr リポジトリ(available.d や config.d を含む)を clone します。
    例: vcsh clone git://github.com/RichiH/vcsh_mr_template.git mr
  2. 利用したいリポジトリを選び、 config.d 内にそれらへのリンクを作成します。
    (または、git にリンクを追加しておいた自分用のデフォルト設定を利用してもよいです)
  3. 次の mr コマンドで対象のリポジトリを全て clone します。cd; mr update
  4. 以上で完了です。

できれば上の内容が、以下の事で節約できる時間がどれほどかを想像する助けになると良いのですが。

  1. 多数のリポジトリに対する管理や clone, update が(mr のおかげで)簡単になります。
  2. $HOME にファイルのリンクを作る必要が(vcsh のおかげで)なくなります。

もしあなたが vcsh を試してみてもいい気分であれば、以降の説明を眺めてください。

使い始めるには

以降では vcsh をセットアップするための 3種類の方法を示します。

  1. テンプレートを利用
  2. テンプレートを部分的に利用
  3. 全て手動

テンプレートを利用

必要な準備

操作を行うユーザにおいて以下のファイルやディレクトリが存在しない事を確認してください。
もし存在するなら移動やリネームしてから以降の手順に進んでください。

  • ~/.gitignore.d
  • ~/.mrconfig
  • $XDG_CONFIG_HOME/mr/available.d/mr.vcsh
  • $XDG_CONFIG_HOME/mr/available.d/zsh.vcsh
  • $XDG_CONFIG_HOME/mr/config.d/mr.vcsh
  • $XDG_CONFIG_HOME/vcsh/repo.d/mr.git/

上の全てのファイルはテンプレートリポジトリに含まれており、ディレクトリはそれらを格納している場所になります。

apt-get install mr

(訳注:上のコマンドは Debian 系の Linux で mr パッケージをインストールするものです。 ご自分の環境に合わせて適切な手段で mr パッケージを導入してください。)

vcsh のインストール

Debian

もし Squeeze(バージョン 6.x) の場合は、コマンド実行の前に apt 設定へ backport リポジトリを追加する必要があります。
Wheezy(バージョン 7.x) 以降ならば、そのまま次のコマンドを入力してください。

apt-get install vcsh
Gentoo

Gentoo Linux の場合は root ユーザで次のコマンドを実行してください。

emerge dev-vcs/vcsh
Arch Linux

vcsh の利用には AUR の設定が必要です。その方法についてのドキュメントは Arch's wiki (訳注:英語です。日本語訳は こちら) を参照してください。

cd /var/abs/local/
wget https://aur.archlinux.org/packages/vc/vcsh-git/vcsh-git.tar.gz
tar xfz vcsh-git.tar.gz
cd vcsh-git
makepkg -s
pacman -U vcsh*.pkg.tar.xz
ソースコードからインストール
# ソースコードをチェックアウトする場所を選びます(以下では ~/work/git)
mkdir -p ~/work/git
cd ~/work/git
git clone git://github.com/RichiH/vcsh.git
cd vcsh
sudo ln -s vcsh /usr/local/bin            # もしくは PATH 環境変数を変更
cd

テンプレートの clone

vcsh clone git://github.com/RichiH/vcsh_mr_template.git mr

テストリポジトリの有効化

mv ~/.zsh   ~/zsh.bak
mv ~/.zshrc ~/zshrc.bak
cd $XDG_CONFIG_HOME/mr/config.d/
ln -s ../available.d/zsh.vcsh .  # zsh リポジトリを有効化するためにリンクを張ります
cd
mr up

あなた自身のリポジトリを設定

ここまで問題が無ければ、テンプレート設定を編集して、あなた用のリモートリポジトリが利用できます。

vim $XDG_CONFIG_HOME/mr/available.d/mr.vcsh
vim $XDG_CONFIG_HOME/mr/available.d/zsh.vcsh

新しい設定を作ることもできます。

vcsh init foo
vcsh foo add bar baz quux
vcsh foo remote add origin git://quuux
vcsh foo commit
vcsh foo push

cp $XDG_CONFIG_HOME/mr/available.d/mr.vcsh $XDG_CONFIG_HOME/mr/available.d/foo.vcsh
vim $XDG_CONFIG_HOME/mr/available.d/foo.vcsh # 対象のリポジトリを指すように変更します

以上で完了です。

テンプレートを部分的に利用

サンプルのリポジトリを clone します。

vcsh clone git://github.com/RichiH/vcsh_mr_template.git mr
# 'include = cat /usr/share/mr/vcsh' の部分が既存ファイルを指すように書き換えて下さい
vim .mrconfig

clone したディレクトリの内容を見て回ります。 サンプルは理解しやすいようシンプルに書かれているはずです。
もし分かりにくければ Freenode(query) か OFTC(#vcs-home) で作者の私 RichiH を捕まえてください。
(訳注:どちらもコミュニケーションは英語になります)

全て手動

以下は私が昔使っていたセットアップ手順です。 あなた自身のスタイルに合うよう調整するか、そのまま利用するか、都合の良い方を選んで下さい。

# 作業場所を用意します
mkdir -p ~/work/git
cd !$

# vcsh を clone し、コマンドを使えるようにします
git clone git://github.com/RichiH/vcsh.git vcsh
sudo ln -s ~/work/git/vcsh/vcsh /usr/bin/local
hash -r

自分の mr 設定を取得します。私の場合は次のように行っています。

vcsh clone ssh://<remote>/mr.git
cd $XDG_CONFIG_HOME/mr/config.d/
ln -s ../available.d/* .

mr を利用して設定などのファイルを実際に取得します。

~ % cat ~/.mrconfig
[DEFAULT]
# 必要なら /usr/share/mr/vcsh の部分をシステムに合わせて変更して下さい
include = cat /usr/share/mr/vcsh
include = cat $XDG_CONFIG_HOME/mr/config.d/*
~ % echo $XDG_CONFIG_HOME
/home/richih/.config
~ % ls $XDG_CONFIG_HOME/mr/available.d # 以下は私のリポジトリからランダムに選んだものです
git-annex gitk.vcsh git.vcsh ikiwiki mr.vcsh reportbug.vcsh snippets.git wget.vcsh zsh.vcsh
~ %
# ここで操作中のパソコンで利用する設定について $XDG_CONFIG_HOME/mr/available.d から
# $XDG_CONFIG_HOME/mr/config.d の中に ln -s を使ってリンクを張ります
~ % cd
~ % mr -j 5 up

mr の使い方 ; 抜粋編集版

リポジトリを最新版に維持するには

これが mr の真髄です。 一度セットアップすれば、次のコマンドを打つだけです。

mr up
mr push

すばらしい。

変更するには

いくつかの変更を行い、通常なら git addgit commit を 使う場面になったら、代わりに(上と同様) vcsh を使います。

vcsh foo add bar baz quux
vcsh foo commit
vcsh foo push

mr を使わずに vcsh を利用するには

vcsh は mr と組み合わせて利用することを勧めています。 これは mr によって本来手動で入力すべき vcsh のコマンドが処理され、大量のリポジトリを管理するのが容易になるためです。
これらを手動あるいは他の手段によって行うことにして、mr を利用しないという選択もできます。

新規リポジトリを作成して初期化: vcsh init zsh

リポジトリを clone: vcsh clone ssh://<remote>/zsh.git

リポジトリを操作するには、通常の Git コマンドを用いますが、 それらの前に vcsh run $repository_name を付けます。
(訳注:上のように書いてありますが、例を見ると Git の場合には rungit を除いても構わないようです。
Git 以外の場合は、説明通りコマンドにvcsh run $repository_name を前置します)
以下がその例です。(訳注:$repository_name は zsh ですね)

vcsh zsh status
vcsh zsh add .zshrc
vcsh zsh commit

当然ながら mr がリポジトリを最新版に維持してくれていた部分も手動で行うことになります。
一つの方法としては次のようなものがあります。

for repo in `vcsh list`; do
    vcsh run $repo git pull;
done

連絡先

あなたのデジタルライフをバージョン管理するアイデアについて話し合う場がいくつかあります。

Room fooへ戻る