Svn-quick-guide
SVN-基本概念
バージョン管理システムとは何ですか?
バージョン管理システム(VCS)は、ソフトウェア開発者が協力して作業の完全な履歴を維持するのに役立つソフトウェアです。
以下はバージョン管理システムの目標です
- 開発者が同時に作業できるようにします。
- 互いの変更を上書きしないでください。
- すべてのすべてのバージョンの履歴を維持します。
- VCSは2つのカテゴリに分かれています。*
- 集中型バージョン管理システム(CVCS)、および
- 分散/分散バージョン管理システム(DVCS)。
このチュートリアルでは、集中型バージョン管理システム、特に Subversion のみに集中します。 Subversionは中央集中型バージョン管理システムに該当します。つまり、中央サーバーを使用してすべてのファイルを保存し、チームのコラボレーションを可能にします。
バージョン管理の用語
このチュートリアルで使用する用語のいくつかについて説明することから始めましょう。
- *リポジトリ:*リポジトリは、バージョン管理システムの中核です。 開発者がすべての作業を保存する中心的な場所です。 リポジトリには、ファイルだけでなく履歴も保存されます。 リポジトリはネットワーク経由でアクセスされ、サーバーとして機能し、クライアントとして機能するバージョン管理ツールです。 クライアントはリポジトリに接続でき、リポジトリへ/から変更を保存/取得できます。 クライアントは、変更を保存することで、これらの変更を他の人が利用できるようにし、変更を取得することで、他の人の変更を作業コピーとして取得します。
- *トランク:*トランクは、すべての主要な開発が行われるディレクトリであり、通常、プロジェクトで作業するために開発者によってチェックアウトされます。
- タグ:タグディレクトリは、プロジェクトの名前付きスナップショットを保存するために使用されます。 タグ操作により、リポジトリ内の特定のバージョンに説明的で覚えやすい名前を付けることができます。 +たとえば、LAST_STABLE_CODE_BEFORE_EMAIL_SUPPORTは、リポジトリUUID:7ceef8cb-3799-40dd-a067-c216ec2e5247および+リビジョン:13よりも記憶に残ります。
- *分岐:*分岐操作は、別の開発ラインを作成するために使用されます。 開発プロセスを2つの異なる方向に分岐させる場合に役立ちます。 たとえば、バージョン5.0をリリースするときに、6.0機能の開発を5.0バグ修正とは別に維持できるように、ブランチを作成することができます。
- *作業コピー:*作業コピーはリポジトリのスナップショットです。 リポジトリはすべてのチームで共有されますが、人々はそれを直接変更しません。 代わりに、各開発者は作業コピーをチェックアウトします。 作業コピーは、開発者が他のチームから隔離されたまま作業を行うことができるプライベートな職場です。
- *変更のコミット:*コミットは、プライベートな職場から中央サーバーへの変更を保存するプロセスです。 コミット後、すべてのチームが変更を利用できるようになります。 他の開発者は、作業コピーを更新することでこれらの変更を取得できます。 コミットはアトミック操作です。 コミット全体が成功するか、ロールバックされます。 ユーザーは、コミットの半分が完了したことを確認しません。
SVN-環境設定
SVNのインストール
Subversionは、人気のあるオープンソースのバージョン管理ツールです。 オープンソースであり、インターネット経由で無料で利用できます。 ほとんどのGNU/Linuxディストリビューションにはデフォルトで付属しているため、すでにシステムにインストールされている可能性があります。 インストールされているかどうかを確認するには、次のコマンドを使用します。
Subversionクライアントがインストールされていない場合、コマンドはエラーを報告します。そうでない場合、インストールされたソフトウェアのバージョンを表示します。
RPMベースのGNU/Linuxを使用している場合は、インストールに yum コマンドを使用します。 インストールが正常に完了したら、 _ svn --version_ コマンドを実行します。
DebianベースのGNU/Linuxを使用している場合は、インストールに apt コマンドを使用します。
Apacheセットアップ
GNU/LinuxにSubversionクライアントをインストールする方法を見てきました。 新しいリポジトリを作成し、ユーザーへのアクセスを許可する方法を見てみましょう。
サーバーに Apache httpd モジュールと svnadmin ツールをインストールする必要があります。
Subversionは、その構成を /etc/httpd/conf.d/subversion.conf ファイルから読み取ります。 設定を追加すると、 _ subversion.conf_ ファイルは次のようになります。
Subversionユーザーを作成して、リポジトリへのアクセスを許可します。 _htpasswd_コマンドは、HTTPユーザーの基本認証のために_usernames_および_passwords_を保存するために使用されるプレーンテキストファイルを作成および更新するために使用されます。 '-c’オプションは_password_ファイルを作成します。_password_ファイルが既に存在する場合は上書きされます。 これが、 '-c’オプションを初めて使用する理由です。 「-m」オプションは、パスワードのMD5暗号化を有効にします。
ユーザー設定
ユーザー tom を作成しましょう。
ユーザー jerry を作成しましょう
すべての作業を保存するSubversion親ディレクトリを作成します(_/etc/httpd/conf.d/subversion.conf_を参照)。
リポジトリのセットアップ
_project_repo_という名前のプロジェクトリポジトリを作成します。 _svnadmin_コマンドは、メタデータを格納するための新しいリポジトリとその中にいくつかの他のディレクトリを作成します。
リポジトリのユーザーとグループの所有権を変更しましょう。
SELinuxステータスツールを使用して、_SELinux_が有効になっているかどうかを確認します。
サーバーでは、SELinuxが有効になっているため、SELinuxセキュリティコンテキストを変更する必要があります。
HTTP経由のコミットを許可するには、次のコマンドを実行します。
Apacheサーバーを再起動すると、Apacheサーバーの構成が完了します。
Apacheサーバーを正常に構成しました。次にリポジトリーを構成します。 正規のユーザーのみにリポジトリへのアクセスを提供し、デフォルトの認証ファイルを使用するには、 _project_repo/conf/svnserve.conf_ファイルに次の行を追加します。
従来、すべてのSubversionプロジェクトには、プロジェクトのルートディレクトリの直下に trunk、tags、 および branches ディレクトリがあります。
_trunk_は、すべての主要な開発が行われるディレクトリであり、通常、開発者がプロジェクトに取り組むためにチェックアウトします。
_tags_ディレクトリは、プロジェクトの名前付きスナップショットを保存するために使用されます。 実稼働リリースを作成するとき、チームはリリースに入るコードにタグを付けます。
_branches_ディレクトリは、さまざまな開発ラインを追求するときに使用されます。
プロジェクトリポジトリの下に、トランク、タグ、およびブランチのディレクトリ構造を作成します。
ここで、ディレクトリを /tmp/svn-template からリポジトリにインポートします。
これは完了です! リポジトリが正常に作成され、 _ Tom_ および Jerry へのアクセスが許可されました。 これ以降、サポートされているすべての操作をリポジトリに対して実行できます。
SVN-ライフサイクル
この章では、バージョン管理システムのライフサイクルについて説明します。 後の章で、各操作のSubversionコマンドを確認します。
リポジトリを作成:
リポジトリは、開発者がすべての作業を保存する中心的な場所です。 リポジトリには、ファイルだけでなく、変更に関する履歴も保存されます。 つまり、ファイルに加えられた変更の履歴を保持します。
「作成」操作は、新しいリポジトリを作成するために使用されます。 ほとんどの場合、この操作は1回だけ実行されます。 新しいリポジトリを作成するとき、VCSは、リポジトリを作成する場所やリポジトリに付ける名前など、リポジトリを識別するために何かを言うことを期待します。
チェックアウト
「チェックアウト」操作は、リポジトリから作業コピーを作成するために使用されます。 作業コピーは、開発者が変更を行い、後でこれらの変更をリポジトリに送信するプライベートな職場です。
更新
名前が示すように、「更新」操作は作業コピーを更新するために使用されます。 この操作により、作業コピーとリポジトリが同期されます。 リポジトリはすべてのチームで共有されるため、他の開発者は変更をコミットでき、作業コピーは古くなります。
_Tom_と_Jerry_がプロジェクトに取り組んでいる2人の開発者であるとします。 どちらもリポジトリから最新バージョンをチェックアウトし、作業を開始します。 この時点で、それらの作業コピーはリポジトリと完全に同期されます。 _Jerry_は作業を非常に効率的に完了し、変更をリポジトリにコミットします。
_Tom’s_作業コピーは古くなっています。 更新操作により、_Jerryの最新の変更がリポジトリから取得され、_Tomの作業コピーが更新されます。
変更を実行
チェックアウト後、さまざまな操作を行って変更を実行できます。 編集は最も一般的な操作です。 既存のファイルを編集して、ファイルの内容を追加/削除できます。
ファイル/ディレクトリを追加できます。 ただし、これらのファイル/ディレクトリはすぐにリポジトリの一部にはならず、代わりに保留中の変更リストに追加され、コミット操作後にリポジトリの一部になります。
同様に、ファイル/ディレクトリを削除できます。 削除操作は、作業コピーからファイルをすぐに削除しますが、ファイルの実際の削除は保留中の変更リストに追加され、コミット操作後にリポジトリに変更が加えられます。
「名前変更」操作は、ファイル/ディレクトリの名前を変更します。 「移動」操作は、リポジトリツリー内のある場所から別の場所にファイル/ディレクトリを移動するために使用されます。
変更を確認
作業コピーをチェックアウトするか、作業コピーを更新すると、作業コピーはリポジトリと完全に同期されます。 しかし、作業コピーに変更を加えると、リポジトリよりも新しくなります。 また、「コミット」操作の前に変更を確認することをお勧めします。
「ステータス」操作には、作業コピーに加えられた変更がリストされます。 前述したように、作業コピーで変更を行うと、これらの変更はすべて保留中の変更リストの一部になります。 また、「ステータス」操作は、保留中の変更リストを表示するために使用されます。
「ステータス」操作では、変更のリストのみが提供され、それらの詳細は提供されません。 _diff_操作を使用して、作業コピーに加えられた変更の詳細を表示できます。
間違いを修正
作業コピーに変更を加えたが、今、彼はこれらの変更を破棄したいとします。 この状況では、「元に戻す」操作が役立ちます。
元に戻す操作は、作業コピーに加えられた変更を元に戻します。 1つ以上のファイル/ディレクトリを元に戻すことができます。 また、作業コピー全体を元に戻すこともできます。 この場合、「元に戻す」操作は保留中の変更リストを破棄し、作業コピーを元の状態に戻します。
競合の解決:
マージ時に競合が発生する可能性があります。 「マージ」操作は、安全に実行できるすべてを自動的に処理します。 それ以外はすべて競合と見なされます。 たとえば、_ "hello.c" _ファイルはブランチで変更され、別のブランチで削除されました。 このような状況では、人が決定を下す必要があります。 「解決」操作は、ユーザーが状況を把握し、競合を処理する方法についてVCSに通知するために使用されます。
変更をコミット
「コミット」操作は、作業コピーからリポジトリに変更を適用するために使用されます。 この操作によりリポジトリが変更され、他の開発者は作業コピーを更新することでこれらの変更を確認できます。
コミットする前に、ファイル/ディレクトリを保留中の変更リストに追加する必要があります。 これは、変更がコミットされるのを待つ場所です。 コミットでは、通常、誰かが変更を加えた理由を説明するログメッセージが提供されます。 このログメッセージは、リポジトリの履歴の一部になります。 コミットはアトミック操作です。つまり、コミット全体が成功するか、ロールバックされます。 ユーザーは、コミットの途中で終了することはありません。
SVN-チェックアウトプロセス
Subversionには、リポジトリから作業コピーをチェックアウトする_checkout_コマンドが用意されています。 以下のコマンドは、_project_repo_という名前で現在の作業ディレクトリに新しいディレクトリを作成します。 ほとんどの場合、リポジトリURLは気にしないでください。Subversion管理者によって適切なアクセス権が既に提供されています。
上記のコマンドは、次の結果を生成します。
チェックアウト操作が成功するたびに、リビジョン番号が印刷されます。 リポジトリに関する詳細情報を表示するには、_info_コマンドを実行します。
上記のコマンドは、次の結果を生成します。
SVN-変更の実行
_Jerry_は、リポジトリの最新バージョンをチェックアウトし、プロジェクトの作業を開始します。 彼は、トランクディレクトリ内に_array.c_ファイルを作成します。
上記のコマンドは、次の結果を生成します。
彼はコミットする前にコードをテストしたいと考えています。
彼は自分のコードをコンパイルしてテストし、すべてが期待どおりに機能しているので、今度は変更をコミットします。
Subversionはファイル名の前に_ '?' _を表示しています。これは、これらのファイルをどうするかわからないためです。
コミットする前に、_Jerry_はこのファイルを保留中の変更リストに追加する必要があります。
「status」操作で確認しましょう。 Subversionは、_array.c_の前に A を示します。つまり、ファイルは保留中の変更リストに正常に追加されます。
_array.c_ファイルをリポジトリに保存するには、commitコマンドの後に-mオプションを指定して、コミットメッセージを続けます。 -mオプションを省略すると、Subversionはテキストエディターを起動し、複数行のメッセージを入力できます。
これで、_array.c_ファイルがリポジトリに正常に追加され、リビジョン番号が1ずつ増加します。
SVN-変更の確認
_Jerry_はすでに_array.c_ファイルをリポジトリに追加しました。 _Tom_は、最新のコードもチェックアウトし、動作を開始します。
上記のコマンドは次の結果を生成します。
しかし、彼は誰かがすでにコードを追加していることを発見しました。 そこで、彼は誰がそれをしたのか興味があり、次のコマンドを使用してログメッセージをチェックして詳細を確認します。
上記のコマンドは次の結果を生成します。
_Tom_が_Jerry’s_のコードを観察すると、彼はすぐにバグに気付きます。 Jerryは配列のオーバーフローをチェックしていなかったため、深刻な問題を引き起こす可能性がありました。 そこで、トムはこの問題を解決することにしました。 変更後、_array.c_は次のようになります。
_Tom_は、ステータス操作を使用して、保留中の変更リストを表示したいと考えています。
_array.c_ファイルが変更されているため、Subversionはファイル名の前に M の文字を表示します。 次に_Tom_は彼のコードをコンパイルおよびテストし、正常に動作しています。 変更をコミットする前に、彼は自分が加えた変更を確認して、それを再確認したいと考えています。
_Tom_は_array.c_ファイルに数行追加しました。そのため、Subversionは新しい行の前に + 記号を表示します。 これで、彼は変更をコミットする準備ができました。
上記のコマンドは、次の結果を生成します。
_Tom’s_の変更はリポジトリに正常にコミットされました。
SVN-更新プロセス
_Jerry_はコードの最初のバージョンをコミットしました。 しかし、彼は、入力を受け入れ、配列の内容を表示するために2つの関数を作成する必要があると考えています。 変更後、_array.c_は次のようになります。
_Jerry_は彼のコードをコンパイルしてテストし、変更をコミットする準備ができています。 その前に、彼は次のコマンドを使用して変更を確認したいと考えています。
上記のコマンドは、次の結果を生成します。
新しく追加された行については、Subversionは行の前に _ + ' 記号を表示し、削除された行については '-_ 記号を表示します。 現在、ジェリーは次のコマンドを使用して変更をコミットしようとします。
上記のコマンドは、次の結果を生成します。
_Tom_はすでにリポジトリを変更しており、_Jerry’s_の作業コピーは古いため、Subversionは_Jerry’s_の変更をコミットできません。 互いの変更を上書きしないように、Subversionはこの操作に失敗します。 _Jerry_は、変更をコミットする前に作業コピーを更新する必要があります。 そこで、以下に示すように、更新コマンドを使用します。
Subversionは、ファイル名の前に G という文字を表示しています。これは、このファイルがマージされたことを意味します。
上記のコマンドは、次の結果を生成します。
Subversionは_Jerry’s_の変更のみを表示しますが、_array.c_ファイルはマージされます。 注意深く観察すると、Subversionはリビジョン番号3を表示しています。 前の出力では、リビジョン番号2が表示されていました。 ファイルを誰がどのような目的で変更したかを確認してください。
これで、_Jerry’s_作業コピーがリポジトリと同期され、安全に変更をコミットできます。
SVN-間違いを修正
_Jerry_が誤って_array.c_ファイルを変更し、コンパイルエラーが発生しているとします。 今、彼は変更を破棄したいと考えています。 この状況では、「元に戻す」操作が役立ちます。 元に戻す操作は、ファイルまたはディレクトリへのローカル変更を取り消し、競合状態を解決します。
上記のコマンドは次の結果を生成します。
次のように配列を作成してみましょう。
上記のコマンドは次の結果を生成します。
_Jerry_は、_array.c_ファイルで「元に戻す」操作を実行します。
次に、コードをコンパイルします。
復帰操作の後、彼の作業コピーは元の状態に戻ります。 元に戻す操作では、1つのファイルとディレクトリ全体を元に戻すことができます。 ディレクトリを元に戻すには、以下に示すように-Rオプションを使用します。
これまで、作業コピーに加えられた変更を元に戻す方法を見てきました。 しかし、コミットされたリビジョンを元に戻したい場合はどうでしょう! バージョン管理システムツールでは、リポジトリから履歴を削除できません。 履歴のみを追加できます。 リポジトリからファイルを削除しても発生します。 古いリビジョンを元に戻すには、古いリビジョンで行われた変更をすべて元に戻し、新しいリビジョンをコミットする必要があります。 これは逆マージと呼ばれます。
Jerryが線形検索操作のコードを追加すると仮定します。 確認後、彼は変更をコミットします。
ジェリーはトムが何をしているのか興味があります。 そこで、彼はSubversionログメッセージをチェックします。
上記のコマンドは、次の結果を生成します。
ログメッセージを表示した後、ジェリーは自分が重大な間違いをしたことに気付きます。 トムはすでにバイナリ検索操作を実装しているため、線形検索よりも優れています。彼のコードは冗長であり、ジェリーは変更を前のリビジョンに戻す必要があります。 そのため、まずリポジトリの現在のリビジョンを見つけます。 現在、リポジトリはリビジョン22にあり、以前のリビジョンに戻す必要があります。 リビジョン21。
SVN-競合の解決
_Tom_は、プロジェクトのREADMEファイルを追加することにしました。 そこで彼は_README_ファイルを作成し、それにTODOリストを追加します。 これを追加すると、ファイルリポジトリはリビジョン6になります。
_Jerry_は、リビジョン6にある最新のコードをチェックアウトします。 そしてすぐに彼は働き始めます。 数時間後、_Tom_はREADMEファイルを更新し、変更をコミットします。 変更されたREADMEは次のようになります。
現在、リポジトリはリビジョン7にあり、_Jerry’s_作業コピーは古くなっています。 _Jerry_はREADMEファイルも更新し、変更をコミットしようとします。
Jerry’s READMEファイルは次のようになります。
ステップ1:競合を表示する
Subversionは、READMEファイルが最後に更新されてから変更されたことを検出しました。 そのため、_Jerry_は作業コピーを更新する必要があります。
SubversionはREADMEファイルとの競合があると不平を言っており、Subversionはこれを解決する方法を知りません。 したがって、_Jerry_は_df_オプションを選択して競合を確認します。
ステップ2:競合を延期する
次に、_Jerry_は_postpone(p)_オプションを選択し、競合を解決できるようにします。
テキストエディターでREADMEを開いた後、彼はSubversionに_Tom’s_コードと競合マーカー付きのコードの両方が含まれていることに気付きました。
_Jerry_は彼と同様に_Tom’s_の変更を望んでいるため、競合マーカーを含む行を削除するだけです。
したがって、変更されたREADMEは次のようになります。
_Jerry_は競合を解決し、コミットを再試行しました。
ステップ3:競合を解決する
上記のコミットでは、文字 C はREADMEファイルに競合があることを示しています。 _Jerry_は競合を解決しましたが、Subversionに競合を解決したことを伝えませんでした。 彼はresolveコマンドを使用して、競合の解決についてSubversionに通知します。
SVN-タグ
バージョン管理システムは、特定のバージョンのコードに意味のある名前を付けることができるという概念を使用して、_tag_操作をサポートしています。 タグを使用すると、コードの特定のバージョンに説明的で覚えやすい名前を付けることができます。 たとえば、 BASIC_ARRAY_OPERATIONS は revision 4 よりも記憶に残ります。
例で_tag_操作を見てみましょう。 トムは、より簡単にコードにアクセスできるようにタグを作成することにしました。
上記のコマンドは次の結果を生成します。
正常に完了すると、_tags_ディレクトリ内に新しいディレクトリが作成されます。
トムは、コミットする前にそれを再確認したいと考えています。 ステータス操作は、タグ操作が成功したことを示しているため、変更を安全にコミットできます。
SVN-分岐
分岐操作は、別の開発ラインを作成します。 誰かが開発プロセスを2つの異なる方向に分岐させたい場合に役立ちます。 バージョン1.0の製品をリリースしたと仮定します。2.0の開発を1.0のバグ修正とは別に維持できるように、新しいブランチを作成することができます。
このセクションでは、ブランチを作成、トラバース、マージする方法を説明します。 ジェリーは紛争のために不満であるため、新しいプライベートブランチを作成することにしました。
現在、ジェリーは私立支店で働いています。 彼は配列のソート操作を追加します。 Jerryの変更されたコードは次のようになります。
上記のコマンドは、次の結果を生成します。
Jerryはコードをコンパイルしてテストし、変更をコミットする準備ができています。
上記のコマンドは、次の結果を生成します。
一方、トランク上で、トムは検索操作を実装することにしました。 トムは検索操作用のコードを追加し、彼のコードは次のようになります。
上記のコマンドは、次の結果を生成します。
確認した後、彼は変更をコミットします。
しかし、トムはジェリーが私立支店で何をしていたのか興味があります。
Subversionのログメッセージを表示すると、トムはJerryが「ソート」操作を実装していることを発見しました。 トムはバイナリ検索アルゴリズムを使用して検索操作を実装しました。常にソートされた順序でデータを期待します。 しかし、ユーザーが並べ替えられていない順序でデータを提供した場合はどうなりますか? その場合、バイナリ検索操作は失敗します。 そこで彼は、検索操作の前にデータをソートするためにジェリーのコードを使用することにしました。 そこで、彼はSubversionにJerryのブランチのコードをトランクにマージするように依頼します。
マージ後、array.cは次のようになります。
上記のコマンドは、次の結果を生成します。
コンパイルとテストの後、トムは自分の変更をリポジトリにコミットします。