第10章 データー管理

目次

10.1. 共有とコピーとアーカイブ
10.1.1. アーカイブと圧縮ツール
10.1.2. コピーと同期ツール
10.1.3. アーカイブの慣用句
10.1.4. コピーの慣用句
10.1.5. ファイル選択の慣用句
10.1.6. アーカイブメディア
10.1.7. リムーバブルストレージデバイス
10.1.8. データー共有用のファイルシステム選択
10.1.9. ネットワーク経由でのデーター共有
10.2. バックアップと復元
10.2.1. バックアプユーティリティーのスイート
10.2.2. システムバックアップ用スクリプトの例
10.2.3. データーバックアップ用コピースクリプト
10.3. データーセキュリティーのインフラ
10.3.1. Gnupg のためのキー管理
10.3.2. GnuPG をファイルに使用
10.3.3. Mutt で GnuPG を使用
10.3.4. Vim で GnuPG を使用
10.3.5. MD5 和
10.4. ソースコードマージツール
10.4.1. ソースファイル間の相違の抽出
10.4.2. ソースファイルに更新をマージ
10.4.3. 3方マージによる更新
10.5. バージョンコントロールシステム
10.5.1. VCS コマンドの比較
10.6. Git
10.6.1. Git クライアントの設定
10.6.2. Git リファレンス
10.6.3. Git コマンド
10.6.4. Subversion レポジトリー用の Git
10.6.5. 設定履歴記録のための Git
10.7. CVS
10.7.1. CVS レポジトリーの設定
10.7.2. CVS へのローカルアクセス
10.7.3. pserver を使った CVS へのリモートアクセス
10.7.4. ssh を使った CVS へのリモートアクセス
10.7.5. 新規ソースを CVS にインポート
10.7.6. CVS レポジトリーのファイルパーミッション
10.7.7. CVS のワークフロー
10.7.8. CVS から最新ファイル
10.7.9. CVS の管理運営
10.7.10. CVS チェックアウトの実行ビット
10.8. Subversion
10.8.1. Subversion レポジトリーの設定
10.8.2. Apach2 サーバーの経由の Subversion アクセス
10.8.3. グループによる Subversion へのローカルアクセス
10.8.4. グループによる Subversion への SSH 経由のリモートアクセス
10.8.5. Subversion ディレクトリー構造
10.8.6. 新規ソースを Subversion にインポート
10.8.7. Subversion のワークフロー

バイナリーとテキストのデーターを Debian システム上で管理するツールとティップを記します。

[警告] 警告

競合状態とならないようにするために、アクティブにアクセスされているデバイスやファイルに複数プロセスから調整なく書き込みアクセスをしてはいけません。flock(1) を使ったファイルロック機構がこの回避に使えます。

データーのセキュリティーとそのコントロールされた共有はいくつかの側面があります。

  • データーアーカイブの作成

  • 遠隔ストレージアクセス

  • 複製

  • 変更履歴の追跡

  • データー共有のアシスト

  • 不正なファイルへのアクセスの防止

  • 不正なファイルの改変の検出

こういったことは次の組み合わせを使うことで実現できます。

  • アーカイブと圧縮ツール

  • コピーと同期ツール

  • ネットワークファイルシステム

  • リムーバブルストレージメディア

  • セキュアーシェル

  • 認証システム

  • バージョンコントロールシステムツール

  • ハッシュや暗号学的暗号化ツール

Debian システム上で利用可能なアーカイブと圧縮ツールのまとめを以下に記します。

表10.1 アーカイブと圧縮ツールのリスト

パッケージ ポプコン サイズ 拡張子 コマンド コメント
tar V:907, I:999 2770 .tar tar(1) 標準アーカイバー (デファクト標準)
cpio V:320, I:998 720 .cpio cpio(1) Unix System V スタイルのアーカイバー、find(1) とともに使用
binutils V:169, I:702 223 .ar ar(1) 静的ライブラリー生成用のアーカイバー
fastjar V:5, I:53 172 .jar fastjar(1) Java 用のアーカイバー (zip 類似)
pax V:16, I:48 170 .pax pax(1) 新規 POSIX 標準アーカイバー、tarcpio の間の妥協点
gzip V:877, I:999 231 .gz gzip(1), zcat(1), … GNU LZ77 圧縮ユーティリティー (デファクト標準)
bzip2 V:212, I:939 184 .bz2 bzip2(1), bzcat(1), … gzip(1) より高い圧縮比 (gzip より遅い、類似シンタックス) の Burrows-Wheeler ブロック並び替え圧縮ユーティリティー
lzma V:4, I:54 126 .lzma lzma(1) gzip(1) より高い圧縮比の LZMA 圧縮ユーティリティー (非推奨)
xz-utils V:401, I:955 515 .xz xz(1), xzdec(1), … bzip2(1) より高い圧縮比の XZ 圧縮ユーティリティー (gzip より遅いが bzip2 より早い、LZMA 圧縮ユーティリティーの代替)
p7zip V:66, I:312 934 .7z 7zr(1), p7zip(1) 高い圧縮比をもつ 7-Zip 圧縮ユーティリティー (LZMA 圧縮)
p7zip-full V:155, I:528 4407 .7z 7z(1), 7za(1) 高い圧縮比をもつ 7-Zip 圧縮ユーティリティー (LZMA 圧縮、他)
lzop V:5, I:45 97 .lzo lzop(1) gzip(1) より高い圧縮と解凍の速度 (gzip より低い圧縮比、類似シンタックス) の LZO 圧縮ユーティリティー
zip V:50, I:415 608 .zip zip(1) InfoZIP: DOS アーカイブと圧縮ツール
unzip V:272, I:796 534 .zip unzip(1) InfoZIP: DOS アーカイブ解凍と圧縮解凍ツール

[警告] 警告

何が起こるかを理解せずに "$TAPE" 変数を設定してはいけません。設定すると tar(1) の挙動が変わります。

[注記] 注記

gzip 圧縮された tar(1) アーカイブは ".tgz" とか ".tar.gz" といったファイル拡張子を使います。

[注記] 注記

xz 圧縮された tar(1) アーカイブは ".txz" とか ".tar.xz" といったファイル拡張子を使います。

[注記] 注記

tar(1) 等の FOSS ツールでのポピュラーな圧縮方法は次のように変遷しています: gzipbzip2xz

[注記] 注記

cp(1)scp(1)tar(1) は特殊ファイルに関して一部制約があるかもしれません。cpio(1) は最も汎用性があります。

[注記] 注記

cpio(1)find(1) 等のコマンドとともに使うようにできていて、ファイルの選定部分のスクリプトを独立にテストできるのでバックアップスクリプトを作るのに向いています。

[注記] 注記

Internal structure of Libreoffice data files are ".jar" file which can be opened also by unzip.

[注記] 注記

The de-facto cross platform archive tool is zip. Use it as "zip -rX" to attain the maximum compatibility. Use also the "-s" option, if the maximum file size matters.

Debian システム上で利用可能な単純なコピーとバックアップツールのまとめを以下に記します。


rsync(8) を使ってのファイルのコピーには他の方法より豊かな機能があります。

  • 転送元のファイルと転送先の既存ファイル間の相違のみを送信する差分転送アルゴリズム

  • サイズか最終変更時間に変更があったファイルのみを探す (デフォルトで採用される) 急速確認アルゴリズム

  • tar(1) 類似の "--exclude" や "--exclude-from" オプション

  • 転送先に追加ディレクトリレベルを作成しなくする「転送元ディレクトリ後スラシュ (/) 付加」文法

[ヒント] ヒント

「データーバックアップ用コピースクリプト」 に記された bkup スクリプトを "-gl" オプションとともに cron(8) の下で実行すると静的なデーターアーカイブに関して Plan9 の dumpfs と非常に似た機能を実現できます。

[ヒント] ヒント

表10.11「バージョンコントロールシステムツールのリスト」に記されたバージョンコントロールシステム (VCS) ツールは多方向のコピーと同期のツールとして機能します。

"./source" ディレクトリー中の全内容を異なるツールを用いてコピーするいくつかの方法を以下に記します。

  • ローカルコピー: "./source" ディレクトリー → "/dest" ディレクトリー

  • リモートコピー: ローカルホストの "./source" ディレクトリー → "user@host.dom" ホストの "/dest" ディレクトリー

rsync(8):

# cd ./source; rsync -aHAXSv . /dest
# cd ./source; rsync -aHAXSv . user@host.dom:/dest

「転送元ディレクトリ後スラシュ付加」文法を上記の代わりに使えます。

# rsync -aHAXSv ./source/ /dest
# rsync -aHAXSv ./source/ user@host.dom:/dest

この代わりに、次のようにも出来ます。

# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . /dest
# cd ./source; find . -print0 | rsync -aHAXSv0 --files-from=- . user@host.dom:/dest

GNU cp(1) と openSSH scp(1):

# cd ./source; cp -a . /dest
# cd ./source; scp -pr . user@host.dom:/dest

GNU tar(1):

# (cd ./source && tar cf - . ) | (cd /dest && tar xvfp - )
# (cd ./source && tar cf - . ) | ssh user@host.dom '(cd /dest && tar xvfp - )'

cpio(1):

# cd ./source; find . -print0 | cpio -pvdm --null --sparse /dest

"." を含むすべての例で "." は"foo" で代替でき、ファイルを "./source/foo" ディレクトリから "/dest/foo" ディレクトリにコピーできます。

"." を含むすべての例で "." を絶対パスの "/path/to/source/foo" で代替でき、"cd ./source;" を削除することができます。これらは使うツール次第で異なる場所にファイルをコピーします。

  • "/dest/foo": rsync(8)、GNU cp(1)scp(1)

  • "/dest/path/to/source/foo": GNU tar(1)cpio(1)

[ヒント] ヒント

rsync(8) や GNU cp(1) には転送先のファイルが新しい場合にスキップする "-u" オプションがあります。

アーカイブやコピーコマンド (「アーカイブの慣用句」「コピーの慣用句」参照下さい) のためや xargs(1) (「ファイルに関してループしながらコマンドを反復実行」参照下さい) のためにファイルを選択するのに find(1) が使われます。これの操作は find(1) のコマンド引数を使うことで強化できます。

find(1) の基本シンタックスは次のようにまとめられます。

  • 条件の引数は左から右へと評価されます。

  • 結果が決まった時点で評価は終了します。

  • "論理 OR" (条件間に "-o" で指定) は、"論理 AND" (条件間に "-a" または何もなしで指定) より低い優先順位です。

  • "論理 NOT" (条件前に "!" で指定) は、"論理 AND" より高い優先順位です。

  • "-prune" は常に論理真 (TRUE) を返し、ディレクトリーの場合にはこの点以降のファイル探索を停止します。

  • "-name" はシェルのグロブ (「シェルグロブ」参照下さい) を使ってファイル名のベースにマッチし、さらに "*" and "?" 等のメタ文字で最初の "." ともマッチします。(新規の POSIX 機能)

  • "-regex" はデフォールトでは emacs スタイルの BRE (「正規表現」参照下さい) を用いてフルパスをマッチします。

  • "-size" はファイルサイズ ("+" が前に付いた値はより大きい、"-" が前に付いた値はより小さい) に基づいてファイルをマッチします。

  • "-newer" はその引数に指定されたファイルより新しいファイルとマッチします。

  • "-print0" は常に論理真 (TRUE) を返し、フルファイル名を (null 終端処理して) 標準出力へプリントします。

find(1) はしばしば慣用的なスタイルで使われます。

# find /path/to \
    -xdev -regextype posix-extended \
    -type f -regex ".*\.cpio|.*~" -prune -o \
    -type d -regex ".*/\.git" -prune -o \
    -type f -size +99M -prune -o \
    -type f -newer /path/to/timestamp -print0

これは次のアクションをすることを意味します。

  1. "/path/to" からはじまる全ファイルを探索

  2. 探索開始したファイルシステムに探索を全体的に制約し、デフォールトの代わりに ERE (「正規表現」参照下さい) を使用

  3. 正規表現 ".*\.cpio" か ".*~" にマッチするファイルを処理停止をすることで探索から除外

  4. 正規表現 ".*/\.git" にマッチするディレクトリーを処理停止をすることで探索から除外

  5. 9MiB(1048576バイトの単位) より大きいファイルを処理停止をすることで探索から除外

  6. 上記の探索条件に合致し "/path/to/timestamp" より新しいファイル名をプリントします

上記例中でファイルを検索から除外するときの "-prune -o" の慣用的な使い方に注目して下さい。

[注記] 注記

非 Debian のUnix 的システムでは、一部のオプションは find(1) によってサポートされていないかもしれません。そのような場合には、マッチング方法を調整したり "-print0" を"-print" で置き換えることを考慮します。これに関連するコマンドも調整する必要があるかもしれません。

重要なデーターアーカイブのためのコンピューターデーターストレージメディアを選ぶ時にはそれらの限界について注意を払うべきです。小さな個人的なバックアップのためには、著者としては名前が知られている会社の CD-R と DVD-R を使い、クールで日陰の乾燥した埃の無い環境に保存しています。(プロ用途ではテープアーカイブメディアに人気があるようです。)

[注記] 注記

耐火金庫は紙の文書のためのものです。ほとんどのコンピューターデーターストレージメディアは紙よりも耐熱性がありません。著者は通常複数の安全な場所に保管された複数のセキュアーな暗号化されたコピーに頼っています。

ネット上に散見するアーカイブメディアの楽観的なストレージ寿命 (ほとんどベンダー情報由来)。

  • 100+年: インクと中性紙

  • 100年: オプティカルストレージ (CD/DVD、CD/DVD-R)

  • 30年: 磁気ストレージ (テープ、フロッピー)

  • 20年: 相変化オプティカルストレージ (CD-RW)

これらは取扱いによる機械的故障等は考慮していません。

ネット上に散見するアーカイブメディアの楽観的な書込み回数 (ほとんどベンダー情報由来)。

  • 250,000+回: ハードディスク

  • 10,000+回: フラッシュメモリー

  • 1,000回: CD/DVD-RW

  • 1回: CD/DVD-R、紙

[注意] 注意

ここにあるストレージ寿命や書込み回数の数字はクリチカルなデーターストレージに関する決定に使うべきではありません。製造者によって提供される特定の製品情報を参照下さい。

[ヒント] ヒント

CD/DVD-R や紙は1回しか書けないので、本質的に重ね書きで間違ってデーターを消すことを防げます。これは、利点です!

[ヒント] ヒント

もし高速で頻繁な大量のデーターのバックアップをする必要がある場合、高速のネットワーク接続でつながっているリモートホスト上のハードディスクが唯一の現実的なオプションかもしれません。

リムーバブルストレージデバイスは次の何れも指します。

これらは次の何れかで接続できます。

GNOME や KDE のような最近のデスクトップ環境は、"/etc/fstab" エントリーにマッチが無いリムーバブルデバイスを自動的にマウントする事ができます。

  • udisks パッケージは、これらのデバイスをマウントやアンマウントするためのデーモンと関連するユーティリティーを提供します。

  • D-bus は、自動的なプロセスを開始するイベントを作成します。

  • PolicyKit が必要な特権を提供します。

[ヒント] ヒント

自動的にマウントされたデバイスは、umount(8) によって利用される "uhelper=" マウントオプションが設定されているかもしれません。

[ヒント] ヒント

"/etc/fstab" にリムーバブルメディアデバイスの記載が無い時のみ、現代的なデスクトップ環境下での自動マウントは起こります。

最新のデスクトップ環境下では次のようにしてカスタマイズ可能なマウント点として "/media/<disk_label>" が選ばれます。

  • FAT ファイルシステムでは、mlabel(1) を使います。

  • ISO9660 ファイルシステムでは、genisoimage(1) を"-V" オプションとともに使います。

  • ext2/ext3/ext4 ファイルシステムでは、tune2fs(1) を"-L" オプションとともに使います。

[ヒント] ヒント

符号化方式 (エンコーディング) の選択をマウントオプションとして与える必要があるかもしれません (「ファイル名の符号化方式」参照下さい)。

[ヒント] ヒント

ファイルシステムをアンマウンとする際に GUI メニューを使うと、動的に生成された "/dev/sdc" 等のデバイスノード削除するかもしれません。もしそのデバイスノードの削除したくない場合にはシェルのコマンドプロンプトから umount(8) コマンドを使いましょう。

リムーバブルストレージデバイスを使ってデーターを共有する際には、両方のシステムにサポートされた共通のファイルシステムでそれをフォーマットするべきです。ファイルシステム選択のリストを次に示します。

表10.3 典型的な使用シナリオに合わせたリムーバブルストレージデバイスのファイルシステムの選択肢のリスト

ファイルシステム 典型的使用シナリオの説明
FAT12 フロッピーディスク上のクロスプラットフォームのデーター共有 (<32MiB)
FAT16 小さなハードディスク類似のデバイス上のクロスプラットフォームのデーター共有 (<2GiB)
FAT32 大きなハードディスク類似のデバイス上のクロスプラットフォームのデーター共有 (<8TiB, MS Windows95 OSR2 以降でサポート有り)
NTFS 大きなハードディスク類似のデバイス上のクロスプラットフォームのデーター共有 (MS Windows NT 以降でネイティブにサポート、Linux 上では FUSE 経由の NTFS-3G でサポート)
ISO9660 CD-R and DVD+/-R 上の静的データーのクロスプラットフォームの共有
UDF CD-R や DVD+/-R 上への増分データーの書込み (新規)
MINIX ファイルシステム フロッピーディスク上へのスペース効率の良い unix ファイルデーターのストレージ
ext2 ファイルシステム 古い Linux システムとハードディスク類似デバイス上のデーターを共有
ext3 ファイルシステム 古い Linux システムとハードディスク類似デバイス上のデーターを共有
ext3 ファイルシステム 最新の Linux システムとハードディスク類似デバイス上のデーターを共有

[ヒント] ヒント

デバイスレベルの暗号化を使ったクロスプラットフォームのデーター共有に関しては、「dm-crypt/LUKS を使ったリムーバブルディスクの暗号化」を参照下さい。

FAT ファイルシステムはほとんど全ての現代的なオペレーティングシステムでサポートされていて、ハードディスク類似のメディア経由でのデーター交換目的に非常に有用です。

クロスプラットフォームの FAT ファイルシステムを使ったデーター共有にリムーバブルハードディスク類似デバイスをフォーマットする時の安全な選択肢は次です。

  • fdisk(8)cfdisk(8)parted(8) (「ディスクパーティション設定」参照下さい) を使ってそれを単一のプライマリパーティションにパーティションしそれを次のようにマークします。

    • 2GB より小さなメディアには FAT16 となるように "6" とタイプします

    • 大きなメディアには FAT32 (LBA) となるように "c" とタイプします

  • 第1パーティションを mkfs.vfat(8) を使って次のようにフォーマットします。

    • FAT16 となるように "/dev/sda1" 等とそのデバイス名だけを使います

    • FAT32 となるように "-F 32 /dev/sda1" 等と明示的なオプション指定とそのデバイス名を使います

FAT とか ISO9660 ファイルシステムを使ってデーターを共有する際の安全への配慮を次に記します。

  • tar(1)cpio(1) を使ってアーカイブファイルに最初にファイルをアーカイブすることで長いファイル名やシンボリックリンクやオリジナルの Unix ファイルパーミッションとオーナー情報を保持します。

  • split(1) コマンドを使ってアーカイブファイルを 2GiB 以下の塊に分割してファイルサイズの制約から保護します。

  • アーカイブファイルを暗号化してその内容を不正アクセスから保護します。

[注記] 注記

FAT ファイルシステムはその設計上最大ファイルサイズは (2^32 - 1) bytes = (4GiB - 1 byte) です。古い 32 ビット OS 上の一部アプリケーションは、最大ファイルサイズはさらに小さく (2^31 - 1) bytes = (2GiB - 1 byte) です。Debian は後者の問題に苦しむことはありません。

[注記] 注記

Microsoft 自身も 200MB を越すドライブやパーティションに FAT を使うことを勧めていません。マイクロソフトは、彼らの "Overview of FAT, HPFS, and NTFS File Systems" で非効率的なディスク領域の使用等の欠点をハイライトしています。もちろん私たちは Linux では通常 ext4 ファイルシステムを使うべきです。

[ヒント] ヒント

ファイルシステムとファイルシステムのアクセスに関しての詳細は、"Filesystems HOWTO" を参照下さい。

データーをネットワーク経由で他のシステムと共有するときには、共通のサービスを使うべきです。次に一部のヒントを記します。


このようなネットワーク経由でマウントされたファイルシステムやネットワーク経由のファイル転送法はデーター共有のために非常に便利ですが、インセキュアーかもしれませんこれらのネットワーク接続は次に記すようにしてセキュアーにされなければいけません。

  • SSL/TLS を使い暗号化

  • SSH 経由でそれをトンネル

  • VPN 経由でそれをトンネル

  • セキュアーファイアウォールの背後に限定

さらに「他のネットワークアプリケーションサーバー」「他のネットワークアプリケーションクライアント」を参照下さい。

コンピューターはいつか壊れるとか、人間によるエラーがシステムやデーターをへの損害を及ぼすことは皆知っています。バックアップと復元の操作は正しいシステム管理の必須構成要素です。考えうる全ての故障モードはいつかの日にやって来ます。

[ヒント] ヒント

バックアップのシステムは簡単にしておき、システムのバックアップは頻繁にします。バックアップデーターが存在することは、あなたのバックアップ方法が技術的に如何に良いかよりも重要です。

実際のバックアップと復元の方針を決める上で3つの要素があります。

  1. 何をバックアップし復元するかを知っていること

    • あなた自身が作成したデーターファイル: "~/" 中のデーター

    • あなた自身が使用したアプリケーションが作成したデーターファイル: "/var/" ("/var/cache/" と "/var/run/" と "/var/tmp/" は除外) 中のデーター

    • システム設定ファイル: "/etc/" 中のデーター

    • ローカルデーター: "/usr/local/" とか "/opt/" 中のデーター

    • システムインストール情報: 要点 (パーティション、…) をプレーンテキストで書いたメモ

    • 実証済みのデーターセット: 事前に実験的復元操作をして確認済み

  2. バックアップと復元の方法を知っていること

    • セキュアーなデーターのストレージ: 上書きやシステム障害の防止

    • 頻繁なバックアップ: スケジュールされたバックアップ

    • 冗長なバックアップ: データーのミラーリング

    • フルプルーフなプロセス: 簡単な単一コマンドバックアップ

  3. 関わっているリスクと費用の評価

    • データーがなくなった際の価値

    • バックアップに必要なリソース: 人的、ハードウエアー、ソフトウエアー、…

    • 故障モードとその確率

[注記] 注記

/proc/sys/tmp/run 上にある擬似ファイルシステム (「procfs と sysfs」「tmpfs」 参照) の内容をバックアップしてはいけません。あなた自身が自分がしていることの意味を余程よく分かっていなければ、これらの内容は巨大で無用なデーターです。

データーのセキュアーなストレージとして、好ましくはファイルシステム破壊に耐えるように異なるディスクや機器上に、少なくとも異なるディスクパーティション上に、データーはあるべきです。重要データーは上書き事故を防ぐために CD/DVD-R のような1回書込みメディアに貯蔵するのが好ましいです。(シェルコマンドラインからストレージメディアにどうして書き込むかについては「バイナリーデーター」を参照下さい。GNOME デスクトップの GUI 環境ではメニュー: "Places→CD/DVD Creator" で簡単に書込みできます。)

[注記] 注記

データーをバックアップする際には MTA (「メールトランスポートエージェント (MTA)」参照下さい) 等のアプリケーションデーモンを停止するのも一計です。

[注記] 注記

"/etc/ssh/ssh_host_dsa_key" や "/etc/ssh/ssh_host_rsa_key" や "~/.gnupg/*" や "~/.ssh/*" や "/etc/passwd" や "/etc/shadow" や "/etc/fetchmailrc" や "popularity-contest.conf" や "/etc/ppp/pap-secrets" や "/etc/exim4/passwd.client" 等のアイデンティティ関連のデーターファイルのバックアップと修復には特に注意が必要です。これらのデーターの一部はシステムに同様な入力をしても再生成できません。

[注記] 注記

ユーザープロセスで cron ジョブを実行している際には、"/var/spool/cron/crontabs" ディレクトリー中のファイルを回復し cron(8) を再スタートしなければいけません。cron(8)crontab(1) に関しては「タスク定期実行のスケジュール」を参照下さい。

Debian システム上で利用可能でバックアップユーティリティーのスイートのなかで際立った選ばれたリストを記します。

表10.5 バックアップスイートのユーティリティーのリスト

パッケージ ポプコン サイズ 説明
dump V:1, I:7 341 ext2/ext3/ext4 ファイルシステム用の 4.4 BSD 由来の dump(8)restore(8)
xfsdump V:0, I:11 838 GNU/Linux と IRIX 上の XFS ファイルシステム用の xfsdump(8)xfsrestore(8) を使う dump と restore
backupninja V:4, I:4 329 軽量で拡張可のメタバックアップシステム
bacula-common V:10, I:19 2055 Bacula: ネットワークバックアップ、復元および検証 - 共通のサポートファイル
bacula-client I:5 162 Bacula: ネットワークバックアップ、復元および検証 - クライアントメタパッケージ
bacula-console V:1, I:7 64 Bacula: ネットワークバックアップ、復元および検証 - テキストコンソール
bacula-server I:2 165 Bacula: ネットワークバックアップ、復元および検証 - サーバーメタパッケージ
amanda-common V:1, I:2 7419 Amanda: Advanced Maryland Automatic Network Disk Archiver (ライブラリー)
amanda-client V:1, I:2 999 Amanda: Advanced Maryland Automatic Network Disk Archiver (クライアント)
amanda-server V:0, I:0 1047 Amanda: Advanced Maryland Automatic Network Disk Archiver (サーバー)
backup-manager V:1, I:2 543 コマンドラインのバックアップツール
backup2l V:1, I:1 113 マウントできるメディアのための低メンテナンスのバックアップ/復旧ツール (ディスクベース)
backuppc V:4, I:5 2232 BackupPC は高性能でエンタープライズ級の、PC をバックアップするためのシステム (ディスクベース)
duplicity V:8, I:15 1534 (リモート) 増分バックアップ
flexbackup V:0, I:0 242 (リモート) 増分バックアップ
rdiff-backup V:9, I:18 704 (リモート) 増分バックアップ
restic V:0, I:0 11149 (リモート) 増分バックアップ
rsnapshot V:6, I:12 452 (リモート) 増分バックアップ
slbackup V:0, I:0 146 (リモート) 増分バックアップ

バックアップツールにはそれぞれの特別な狙いがあります。

  • Mondo Rescue を使うと、通常のインストールプロセスを経ずにバックアップ CD/DVD 等から完全なシステムを迅速に復旧できます。

  • Regular backups of user data can be realized by a simple script (「システムバックアップ用スクリプトの例」) and cron(8).

  • BaculaAmandaBackupPC は、ネットワーク越しの定期的バックアップに焦点のあるフル機能のバックアップスイートです。

「アーカイブと圧縮ツール」「コピーと同期ツール」に記された基本的なツールを使うとカスタムスクリプト経由のシステムバックアップができます。そのようなスクリプトは次を使うと強化できます。

  • The restic package enables incremental (remote) backups.

  • rdiff-backup パッケージは (リモートの) 増分バックアップを可能にします。

  • dump パッケージは全ファイルシステムの効率的かつ増分のバックアップと復旧を補助します。

[ヒント] ヒント

dump パッケージに関して学ぶには、"/usr/share/doc/dump/" の中のファイルと "Is dump really deprecated?" を参照下さい。

個人の Debian の unstable (非安定) スイートを実行するデスクトップシステムでは、個人的だったりクリティカルなデーターのみを保護する必要しかありません。いずれにせよ1年に1回はシステムを再インストールします。だから全システムをバックアップする理由もありませんし、フル機能のバックアップユーティリティーをインストールする理由もありません。

簡単なスクリプトでバックアップ用アーカイブを作成し、GUI を使って CD/DVD にそれを焼きます。次のこのスクリプトの例を示します。

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
BUUID=1000; USER=osamu # UID and name of a user who accesses backup files
BUDIR="/var/backups"
XDIR0=".+/Mail|.+/Desktop"
XDIR1=".+/\.thumbnails|.+/\.?Trash|.+/\.?[cC]ache|.+/\.gvfs|.+/sessions"
XDIR2=".+/CVS|.+/\.git|.+/\.svn|.+/Downloads|.+/Archive|.+/Checkout|.+/tmp"
XSFX=".+\.iso|.+\.tgz|.+\.tar\.gz|.+\.tar\.bz2|.+\.cpio|.+\.tmp|.+\.swp|.+~"
SIZE="+99M"
DATE=$(date --utc +"%Y%m%d-%H%M")
[ -d "$BUDIR" ] || mkdir -p "BUDIR"
umask 077
dpkg --get-selections \* > /var/lib/dpkg/dpkg-selections.list
debconf-get-selections > /var/cache/debconf/debconf-selections

{
find /etc /usr/local /opt /var/lib/dpkg/dpkg-selections.list \
     /var/cache/debconf/debconf-selections -xdev -print0
find /home/$USER /root -xdev -regextype posix-extended \
  -type d -regex "$XDIR0|$XDIR1" -prune -o -type f -regex "$XSFX" -prune -o \
  -type f -size  "$SIZE" -prune -o -print0
find /home/$USER/Mail/Inbox /home/$USER/Mail/Outbox -print0
find /home/$USER/Desktop  -xdev -regextype posix-extended \
  -type d -regex "$XDIR2" -prune -o -type f -regex "$XSFX" -prune -o \
  -type f -size  "$SIZE" -prune -o -print0
} | cpio -ov --null -O $BUDIR/BU$DATE.cpio
chown $BUUID $BUDIR/BU$DATE.cpio
touch $BUDIR/backup.stamp

root から実行されるスクリプト断片の例と言う位置づけです。

著者はこれをあなたが次のように変更し実行する事を期待します。

簡潔にしましょう!

[ヒント] ヒント

debconf の設定データーは "debconf-set-selections debconf-selections" で、dpkg の選択データーは "dpkg --set-selection <dpkg-selections.list" で復元できます。

ディレクトリーツリーの下のデーターセットは、"cp -a" としてコピーすると通常のバックアップができます。

"/var/cache/apt/packages/" ディレクトリーの下のデーターのようなディレクトリーの下の大きな上書きされない静的なデーターセットは、"cp -al" を利用するハードリンクを使うと通常のバックアップに代わるディスク空間を効率的に利用するバックアップができます。

私が bkup と名付けたデーターバックアップのためのコピースクリプトを次に示します。このスクリプトは現ディレクトリーの下の全ての (非 VCS) ファイルを親ディレクトリーかリモートホストの日付入りディレクトリーにコピーします。

#!/bin/sh -e
# Copyright (C) 2007-2008 Osamu Aoki <osamu@debian.org>, Public Domain
fdot(){ find . -type d \( -iname ".?*" -o -iname "CVS" \) -prune -o -print0;}
fall(){ find . -print0;}
mkdircd(){ mkdir -p "$1";chmod 700 "$1";cd "$1">/dev/null;}
FIND="fdot";OPT="-a";MODE="CPIOP";HOST="localhost";EXTP="$(hostname -f)"
BKUP="$(basename $(pwd)).bkup";TIME="$(date  +%Y%m%d-%H%M%S)";BU="$BKUP/$TIME"
while getopts gcCsStrlLaAxe:h:T f; do case $f in
g)  MODE="GNUCP";; # cp (GNU)
c)  MODE="CPIOP";; # cpio -p
C)  MODE="CPIOI";; # cpio -i
s)  MODE="CPIOSSH";; # cpio/ssh
t)  MODE="TARSSH";; # tar/ssh
r)  MODE="RSYNCSSH";; # rsync/ssh
l)  OPT="-alv";; # hardlink (GNU cp)
L)  OPT="-av";;  # copy (GNU cp)
a)  FIND="fall";; # find all
A)  FIND="fdot";; # find non CVS/ .???/
x)  set -x;; # trace
e)  EXTP="${OPTARG}";; # hostname -f
h)  HOST="${OPTARG}";; # user@remotehost.example.com
T)  MODE="TEST";; # test find mode
\?) echo "use -x for trace."
esac; done
shift $(expr $OPTIND - 1)
if [ $# -gt 0 ]; then
  for x in $@; do cp $OPT $x $x.$TIME; done
elif [ $MODE = GNUCP ]; then
  mkdir -p "../$BU";chmod 700 "../$BU";cp $OPT . "../$BU/"
elif [ $MODE = CPIOP ]; then
  mkdir -p "../$BU";chmod 700 "../$BU"
  $FIND|cpio --null --sparse -pvd ../$BU
elif [ $MODE = CPIOI ]; then
  $FIND|cpio -ov --null | ( mkdircd "../$BU"&&cpio -i )
elif [ $MODE = CPIOSSH ]; then
  $FIND|cpio -ov --null|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&&cpio -i )"
elif [ $MODE = TARSSH ]; then
  (tar cvf - . )|ssh -C $HOST "( mkdircd \"$EXTP/$BU\"&& tar xvfp - )"
elif [ $MODE = RSYNCSSH ]; then
  rsync -aHAXSv ./ "${HOST}:${EXTP}-${BKUP}-${TIME}"
else
  echo "Any other idea to backup?"
  $FIND |xargs -0 -n 1 echo
fi

これはコマンド例の位置付けです。スクリプトを読んで自分自身で編集してからご使用下さい。

[ヒント] ヒント

私はこの bkup を私の "/usr/local/bin/" ディレクトリーに置いています。わたしは一時的スナップショットのバックアップが必要な時に、作業ディレクトリー中で引数無しにこの bkup コマンドを実行します。

[ヒント] ヒント

ソースファイルツリーや設定ファイルツリーのスナップショットの履歴を作成するには、git(7) を使うのが簡単でスペースの効率も良ろしいです (「設定履歴記録のための Git」参照下さい)。

データーのセキュリティーのインフラはデーターの暗号化のツールとメッセージダイジェストのツールと署名ツールの組み合わせで提供されます。


Linux カーネルモジュール経由で自動的データー暗号化のインフラを実現する dm-cryptoecryptfs に関しては 「データー暗号化ティップ」を参照下さい。

基本的なキー管理に関する GNU プライバシガードコマンドを次に記します。


トラストコードの意味を次に記します。


次のようにすると私のキー "1DD8D791" をポピュラーなキーサーバー "hkp://keys.gnupg.net" にアップロード出来ます。

$ gpg --keyserver hkp://keys.gnupg.net --send-keys 1DD8D791

"~/.gnupg/gpg.conf" (もしくは古い場所 "~/.gnupg/options") 中の良いデフォールトのキーサーバーの設定は次を含みます。

keyserver hkp://keys.gnupg.net

次によってキーサーバーから知らないキーが獲得できます。

$ gpg --list-sigs --with-colons | grep '^sig.*\[User ID not found\]' |\
  cut -d ':' -f 5| sort | uniq | xargs gpg --recv-keys

OpenPGP 公開キーサーバー (バージョン0.9.6以前) に2つ以上サブキーのあるキーを壊すバグがありました。新しい gnupg (>1.2.1-2) パッケージはこのような壊れたサブキーを取り扱えます。gpg(1) の"--repair-pks-subkey-bug" オプションの説明を参照下さい。

md5sum(1)rfc1321 の方法を使ってダイジェストファイルを作成し各ファイルをそれで確認するユーティリティーを提供します。

$ md5sum foo bar >baz.md5
$ cat baz.md5
d3b07384d113edec49eaa6238ad5ff00  foo
c157a79031e1c40f85931829bc5fc552  bar
$ md5sum -c baz.md5
foo: OK
bar: OK
[注記] 注記

MD5 和の計算は GNU プライバシーガード (GnuPG) による暗号学的署名の計算より CPU への負荷がかかりません。通常、一番上のレベルのダイジェストファイルだけがデーターの整合性のために暗号学的に署名されます。

ソースコードをマージする多くのツールがあります。次のコマンドが著者の目に止まりました。

表10.10 ソースコードマージツールのリスト

パッケージ ポプコン サイズ コマンド 説明
diffutils V:857, I:981 1394 diff(1) 1行ごとにファイルを比較
diffutils V:857, I:981 1394 diff3(1) 1行ごとにファイルを比較やマージ
vim V:122, I:392 2470 vimdiff(1) vim で2つのファイルを並べて比較
patch V:98, I:857 216 patch(1) 差分ファイルをオリジナルに適用
dpatch V:1, I:16 191 dpatch(1) Debian パッケージのためにパッチのシリーズを管理
diffstat V:21, I:186 70 diffstat(1) 差分ファイルによる変化のヒストグラム作成
patchutils V:20, I:179 223 combinediff(1) 2つの積み重ねパッチから1つの合計パッチを生成
patchutils V:20, I:179 223 dehtmldiff(1) HTML ページから差分ファイルを抽出
patchutils V:20, I:179 223 filterdiff(1) 差分ファイルから差分ファイルを抽出や削除
patchutils V:20, I:179 223 fixcvsdiff(1) CVS により作成された patch(1) が誤解する差分ファイルを修正
patchutils V:20, I:179 223 flipdiff(1) 古い2つのパッチを交換
patchutils V:20, I:179 223 grepdiff(1) 正規表現にマッチするパッチによって変更されるファイルを表示
patchutils V:20, I:179 223 interdiff(1) 2つのユニファイド差分ファイル間の違いを表示
patchutils V:20, I:179 223 lsdiff(1) どのファイルがパッチによって変更されるかを表示
patchutils V:20, I:179 223 recountdiff(1) ユニファイドコンテキスト差分ファイルのカウントやオフセットを再計算
patchutils V:20, I:179 223 rediff(1) 手編集された差分ファイルのカウントやオフセットを再計算
patchutils V:20, I:179 223 splitdiff(1) 増分パッチの分離
patchutils V:20, I:179 223 unwrapdiff(1) ワードラップされたパッチを復元
wiggle V:0, I:0 166 wiggle(1) リジェクトされたパッチを適用
quilt V:4, I:43 711 quilt(1) パッチのシリーズを管理
meld V:15, I:41 3115 meld(1) ファイルを比較やマージ (GTK)
dirdiff V:0, I:2 144 dirdiff(1) ディレクトリーツリー間で相違点の表示と変更のマージ
docdiff V:0, I:0 573 docdiff(1) 2つのファイルをワード毎/文字毎に比較
imediff2 V:0, I:0 34 imediff2(1) 対話型フルスクリーンの2方マージツール
makepatch V:0, I:0 102 makepatch(1) 拡張パッチファイルの生成
makepatch V:0, I:0 102 applypatch(1) 拡張パッチファイルの適用
wdiff V:5, I:81 643 wdiff(1) テキストファイル間のワードの相違表示

Debian システム上のバージョンコントロールシステム (VCS) のまとめを次に記します。

[注記] 注記

VCS システムを今始めて学ぶ場合には、人気が出て来ている Git から学び出すことをお薦めします。


VCS はリビジョンコントロールシステム (RCS) とかソフトウエアー設定管理 (SCM) という別名もあります。

Git のような分散 VCS が最近一番人気のツールです。CVS や Subversion は既存のオープンソースプログラム活動に参加するのにまだ有用かもしれません。

Debian はDebian Alioth サービス経由でフリーの VCS サービスを提供します。それは実質的に全ての VCS をサポートします。その説明文書は http://wiki.debian.org/Alioth にあります。

VCS アーカイブへの共有アクセスを作るための基本が数点あります。

次に全体像を提供するべく元来の VCS コマンドを極端に簡略化した比較を示します。典型的なコマンド文字列はオプションや引数が必要となるかもしれません。


[注意] 注意

git サブコマンドを直接 "git-xyz" としてコマンドラインから起動するのは2006年初以来推奨されません。

[ヒント] ヒント

$PATH で指定されたパス中に実行可能ファイル git-foo が存在する場合、ハイフォン無しの "git foo" をコマンドラインに入力するとこの git-foo が起動されます。これは git コマンドの機能です。

[ヒント] ヒント

tkcvs(1)gitk(1) 等の GUI ツールはファイルの変更履歴を追跡するのに本当に役立ちます。多くの公開アーカイブが彼らのレポジトリーの中を閲覧するための提供しているウェッブインターフェースもまた非常に有用です。

[ヒント] ヒント

Git はgit-cvsgit-svn パッケージを使って CVS や Subversion によって提供されるレポジトリー等の他の VCS レポジトリーを直接処理したり、ローカル変更のためのローカルレポジトリーを提供します。git for CVS users「Subversion レポジトリー用の Git」を参照下さい。

[ヒント] ヒント

CVS や Subversion に等価コマンドが無いコマンドが Git にあります: "fetch"、"rebase"、"cherry-pick"、…

Git はローカルとリモートのソースコード管理の全機能があります。これはリモートレポジトリーとのネットワーク接続なしにソースコードへの変更を記録できるといことです。

次を参照下さい。

git-gui(1)gitk(1) コマンドは簡単に Git が利用出来るようにします。

[警告] 警告

たとえ gitk(1) 等の一部ツールが受け付けるからといって、タグ文字列中にスペースを使ってはいけません。他の git コマンドで支障が起こるかもしれません。

アップストリームが異なる VCS を使っていようと、アップストリームへのネットワーク接続無しにローカルコピーを管理できるので、ローカル活動に git(1) を使うのは良い考えかもしれません。次は git(1) とともに使われるパッケージとコマンドのリストです。


[ヒント] ヒント

git(1) では、多くのコミットをしながらローカルブランチ上で仕事をして "git rebase -i master" 等を使って後から変更履歴を整理します。こうすると綺麗な変更履歴が作れます。git-rebase(1)git-cherry-pick(1) を参照下さい。

[ヒント] ヒント

作業中のディレクトリの現状を失わずにクリーンな作業ディレクトリを取り戻すには "git stash" を使えばできます。git-stash(1) を参照ください。

Git ツールを使い設定の経時履歴をマニュアルで記録できます。次は "/etc/apt/" の内容を記録する単純な練習例です。

$ cd /etc/apt/
$ sudo git init
$ sudo chmod 700 .git
$ sudo git add .
$ sudo git commit -a

設定を説明とともにコミットします。

設定ファイルへの変更をします。

$ cd /etc/apt/
$ sudo git commit -a

設定を説明とともにコミットしそのままいろいろ作業をしていきます。

$ cd /etc/apt/
$ sudo gitk --all

フルの履歴を手中しています。

[注記] 注記

設定データーのどのファイルパーミッションでも機能するためには sudo(8) が必要です。ユーザーの設定データーの場合 sudo をスキップ出来るかもしれません。

[注記] 注記

上記例での "chmod 700 .git" コマンドはアーカイブデーターを不正読出しアクセスから守るために必要です。

[ヒント] ヒント

設定履歴の記録に関するより完全なセットアップは、etckeeper パッケージを見て下さい: 「設定ファイルの変更記録」

次を参照下さい。

  • cvs(1)

  • "/usr/share/doc/cvs/html-cvsclient"

  • "/usr/share/doc/cvs/html-info"

  • "/usr/share/doc/cvsbook"

  • "info cvs"

多くの公開 CVS サーバーはアカウント名 "anonymous" で pserver サービス経由の読出しのみアクセスを提供します。例えば、Debian ウェッブサイト内容は webwml プロジェクトは Debian alioth サービスでの CVS を使ってメンテされています。次はこの CVS レポジトリーへのリモートアクセスのための "$CVSROOT" を設定します。

$ export CVSROOT=:pserver:anonymous@anonscm.debian.org:/cvs/webwml
$ cvs login
[注記] 注記

pserver は盗聴攻撃されやすくインセキュアーなので、書込みアクセスはサーバーの管理者によって通常無効にされています。

次は SSH を使い webwml プロジェクトの CVS レポジトリーをリモートアクセスするために "$CVS_RSH" と "$CVSROOT" を設定します。

$ export CVS_RSH=ssh
$ export CVSROOT=:ext:account@cvs.alioth.debian.org:/cvs/webwml

リモートパスワードプロンプトを無くすのに SSH を使ったパブリックキー認証を使えます。

次に CVS を使う典型的なワークフローを記します。

"$CVSROOT" で指される CVS プロジェクトから得られる全てのモジュールを次のようにしてチェックします。

$ cvs rls
CVSROOT
module1
module2
...

"module1" をそのデフォールトディレクトリーの "./module1" に次のようにしてチェックアウトします。

$ cd ~/path/to
$ cvs co module1
$ cd module1

必要に応じ内容に変更を加える。

次のようにして "diff -u [repository] [local]" と等価を作成し変更をチェックします。

$ cvs diff -u

あるファイル "file_to_undo" をひどく壊したが他のファイルは大丈夫な事に気づきます。

次のようにして "file_to_undo" ファイルを CVS からのクリーンコピーで上書きします。

$ cvs up -C file_to_undo

次のようにして更新されたローカルソースツリーを CVS に保存します。

$ cvs ci -m "Describe change"

次のようにして "file_to_add" ファイルを作成し CVS に追加します。

$ vi file_to_add
$ cvs add file_to_add
$ cvs ci -m "Added file_to_add"

次のようにして CVS から最新バージョンをマージします。

$ cvs up -d

コンフリクトある変更を意味する "C filename" で始まる行に注意します。

".#filename.version" 中の変更されていないコードを探します。

コンフリクトある変更はファイル中の "<<<<<<<" や ">>>>>>>" を探索します。

必要に応じコンフリクト解消のためにファイルを編集します。

次のようにしてリリースタグ "Release-1" を追加します。

$ cvs ci -m "last commit for Release-1"
$ cvs tag Release-1

さらに編集します。

次のようにリリースタグ "Release-1" を削除します。

$ cvs tag -d Release-1

次のように CVS へ変更をチェックインします。

$ cvs ci -m "real last commit for Release-1"

リリースタグ "Release-1" を更新した CVS の main の HEAD に次のようにして再付加します。

$ cvs tag Release-1

次のようにして "Release-initial" タグによってで指定されるオリジナルのバージョンから、スティッキーブランチタグが "Release-initial-bugfixes" のブランチを作成し、"~/path/to/old" ディレクトリーにチェックアウトします。

$ cvs rtag -b -r Release-initial Release-initial-bugfixes module1
$ cd ~/path/to
$ cvs co -r Release-initial-bugfixes -d old module1
$ cd old
[ヒント] ヒント

ブランチポイントとして特定の日付を指定するには "-r Release-initial" の代わりに "-D 2005-12-20" (ISO 8601 日付フォーマット) を使います。

オリジナルバージョンに基づいたスティッキータグ "Release-initial-bugfixes" が付いているこのローカルのソースツリーで作業をします。

このブランチで一人で作業をします … 誰か他の人がこの "Release-initial-bugfixes" ブランチに合流するまで。

次のようにして必要に応じて新規ディレクトリーを作りながらこのブランチ上の他の人が変更したファイルと同期します。

$ cvs up -d

必要に応じコンフリクト解消のためにファイルを編集します。

次のように CVS へ変更をチェックインします。

$ cvs ci -m "checked into this branch"

次のようにしてスティッキータグを削除し ("-A")、キーワード展開せずに ("-kk")、main の HEAD (最新版) をつかってローカルのツリーを更新します。

$ cvs up -d -kk -A

次のようにしてキーワード展開せずに ("-kk")、"Release-initial-bugfixes" ブランチをマージしてローカルのツリー (内容 = main の HEAD) を更新します。

$ cvs up -d -kk -j Release-initial-bugfixes

エディターを使ってコンフリクト解消します。

次のように CVS へ変更をチェックインします。

$ cvs ci -m "merged Release-initial-bugfixes"

次のようにしてアーカイブを作成します。

$ cd ..
$ mv old old-module1-bugfixes
$ tar -cvzf old-module1-bugfixes.tar.gz old-module1-bugfixes
$ rm -rf old-module1-bugfixes
[ヒント] ヒント

"cvs up" コマンドには、新規ディレクトリー作成には "-d" オプションを、また空ディレクトリーの摘み取りには "-P" オプションを指定できます。

[ヒント] ヒント

"cvs co module1/subdir" とサブディレクトリーの名前を提供して、"module1" のサブディレクトリーだけをチェックアウトすることが出来ます。


Subversion は旧来の CVS を置き換える最近の世代のバージョンコントロールシステムです。Subversion にはタグとブランチを除く CVS のほとんどの機能をあります。

Subversion のサーバーをセットアップするには、subversionlibapache2-svnsubversion-tools パッケージをインストールする必要があります。

次に Subversion をその本来のクライアントとともに使う典型的なワークフローを記します。

[ヒント] ヒント

git-svn パッケージによって提供されるクライアントコマンドは git コマンドを使う Subversion の代替ワークフローを提供します。「Subversion レポジトリー用の Git」を参照下さい。

"file:///srv/svn/project" の URL で指定される Subversion プロジェクトから得られる全ての利用可能なモジュールを次のようにしてチェックします。

$ svn list file:///srv/svn/project
module1
module2
...

次のようにして "module1/trunk" を"module1" ディレクトリーにチェックアウトします。

$ cd ~/path/to
$ svn co file:///srv/svn/project/module1/trunk module1
$ cd module1

必要に応じ内容に変更を加える。

次のようにして "diff -u [repository] [local]" と等価を作成し変更をチェックします。

$ svn diff

あるファイル "file_to_undo" をひどく壊したが他のファイルは大丈夫な事に気づきます。

次のようにして "file_to_undo" ファイルを Subversion からのクリーンコピーで上書きします。

$ svn revert file_to_undo

更新されたローカルソースツリーを次のようにして Subversion に保存します。

$ svn ci -m "Describe change"

次のようにして "file_to_add" ファイルを作成し Subversion に追加します。

$ vi file_to_add
$ svn add file_to_add
$ svn ci -m "Added file_to_add"

次のようにして Subversion から最新バージョンをマージします。

$ svn up

コンフリクトある変更を意味する "C filename" で始まる行に注意します。

"filename.r6" と "filename.r9" と "filename.mine" 等中の変更されていないコードを探します。

コンフリクトある変更はファイル中の "<<<<<<<" や ">>>>>>>" を探索します。

必要に応じコンフリクト解消のためにファイルを編集します。

次のようにしてリリースタグ "Release-1" を追加します。

$ svn ci -m "last commit for Release-1"
$ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-1

さらに編集します。

次のようにリリースタグ "Release-1" を削除します。

$ svn rm file:///srv/svn/project/module1/tags/Release-1

次のようにして変更を Subversion にチェックインします。

$ svn ci -m "real last commit for Release-1"

リリースタグ "Release-1" を更新した Subversion の trunk の HEAD に再付加します。

$ svn cp file:///srv/svn/project/module1/trunk file:///srv/svn/project/module1/tags/Release-1

次のようにして "module1/tags/Release-initial" というパスで指定されるオリジナルのバージョンから、パスが "module1/branches/Release-initial-bugfixes" のブランチを作成し、"~/path/to/old" ディレクトリーにチェックアウトします。

$ svn cp file:///srv/svn/project/module1/tags/Release-initial file:///srv/svn/project/module1/branches/Release-initial-bugfixes
$ cd ~/path/to
$ svn co file:///srv/svn/project/module1/branches/Release-initial-bugfixes old
$ cd old
[ヒント] ヒント

ブランチポイントとして特定の日付を指定するには "module1/tags/Release-initial" の代わりに "module1/trunk@{2005-12-20}" (ISO 8601 日付フォーマット) を使います。

オリジナルバージョンに基づいたブランチ "Release-initial-bugfixes" を指定しているローカルのソースツリーで作業します。

このブランチで一人で作業をします … 誰か他の人がこの "Release-initial-bugfixes" ブランチに合流するまで。

次のようにしてこのブランチ上の他の人が変更したファイルと同期します。

$ svn up

必要に応じコンフリクト解消のためにファイルを編集します。

次のようにして変更を Subversion にチェックインします。

$ svn ci -m "checked into this branch"

trunk の HEAD を使って次のようにローカルツリーを更新します。

$ svn switch file:///srv/svn/project/module1/trunk

次のようにして "Release-initial-bugfixes" ブランチをマージしてローカルのツリー (内容 = trunk の HEAD) を更新します。

$ svn merge file:///srv/svn/project/module1/branches/Release-initial-bugfixes

エディターを使ってコンフリクト解消します。

次のようにして変更を Subversion にチェックインします。

$ svn ci -m "merged Release-initial-bugfixes"

次のようにしてアーカイブを作成します。

$ cd ..
$ mv old old-module1-bugfixes
$ tar -cvzf old-module1-bugfixes.tar.gz old-module1-bugfixes
$ rm -rf old-module1-bugfixes
[ヒント] ヒント

"file:///…" といった URL は、"http://…" や "svn+ssh://…" といったいかなる他形式の URL ででも置き換えられます。

[ヒント] ヒント

"svn co file:///srv/svn/project/module1/trunk/subdir module1/subdir" とサブディレクトリーの名前を提供して、"module1" のサブディレクトリーだけをチェックアウトすることが出来ます。