!! 目的 ソフトウェアをグループで開発する際,バージョン管理を行うことは必須でしょう. バージョンを管理してくれるソフトウェアはいくつも知られていますが, 本講義では subversion (svn) を使ってもらっています. Subversionの復習を行い,もっと効果的にsubversionを使ってもらうことが本講義の目的です. このページは [[svn::簡単な使い方]] を基に作成しました. !! Subversionの利用したソフトウェア開発の概要 Subversionを使う際の概要を図示すると以下のようになります. ((img outline.png 500)) 図において,班員達は,共有ディレクトリを更新(チェックアウト,コミット)しながらソフトウェア開発を行っています. この共有ディレクトリのことを((color red リポジトリ))といいます. 正確には,バージョン管理されたディレクトリです. リポジトリの中には,グループで開発したプログラムソースやドキュメントなどが格納されています. 本講義では,このリポジトリをどのように更新していくのかを解説することで, subversionを利用したソフトウェア開発の流れの一例を解説します. //* [[サブバージョンの使い方]]を参照のこと. //* リポジトリ,ワーキングコピー,リビジョン,チェックアウト,コミット,などの単語の意味を理解すること. //** 普段の作業は,リポジトリからチェックアウトしたワーキングコピーの方を使う.'''リポジトリそのものには手を触れない'''. //** ある程度の完成度まで到達したら,ワーキングコピー(中の修正したファイル群)の内容をリポジトリに反映させる.これがコミット. //** コミット時には,どのファイルを,どのように修正したか,といった内容をログに残しておく. //** 別の人間が,同じファイルを別々に修正して,それぞれでコミットしようとすると衝突(コンフリクト)する //*** コンフリクトは,手動で対処する以外に方法はない. !! ワーキングコピーの取得: svn checkout ソフトウェアを開発する際,リポジトリに格納されているファイルを直接に編集することは行いません. リポジトリの中身を,いったん,ローカルディレクトリにコピーして, コピーしたファイルを編集します. このローカルコピーのことを((color red ワーキングコピー))とか,((color red 作業コピー))と呼びます. まずはリポジトリからコピーを取得する操作を行ってみましょう. コピーしたいディレクトリに移動して'''checkout'''します. 仮に,~/csd 以下に, proj という名前のワーキングコピーを展開するとすると, 8< % cd ~/csd % svn co https://svn.cis.iwate-u.ac.jp/svn/csd/proj >8 !! ワーキングコピーの更新: svn update 複数の人間で開発を行なう場合,'''編集作業を行う前に必ず''' ワーキングコピーに(リポジトリの)最新情報を反映させる必要がある. 8< % cd ~/csd/proj % svn update >8 !! ワーキングコピーの状態確認: svn status ワーキングコピーの状態を確かめるには, (ワーキングコピーが存在するディレクトリ以下で) 8< % svn status >8 とする.先頭のマークで状態が分かる. 6< :? ::どんな状態か分からない.(例えば,ワーキングコピーディレクトリ下に新たにファイルを作成したが,svn addしていない場合,とか) :A ::追加 :D ::削除 :C ::衝突 :M ::変更 :! ::バージョン管理下で,ファイル,ディレクトリが不完全,または失われている.svn のコマンド以外でファイルを消去したりするとよく起こる.svn revertなどを使って回復できるが,revertコマンドは「変更を破棄してしまう」という意味で本質的に危険なので,多用しないこと.(!フラグが出ないように気をつけてファイル管理すること) >9 !! ワーキングコピーに対する修正変更をリポジトリに登録: svn ci 自分が加えた修正をリポジトリに反映させるには,次のように'''svn ci'''を実行する. 8< (proj内のxxx.cを修正して登録する場合の例) % cd ~/csd/proj % emacs xxx.c % svn ci -m 'コミットメッセージ' >8 「コミットメッセージ」には,何を変更したかを書いておく('''他の共同開発者にわかるように''') まったく無意味なメッセージを書くことは極力避けるべきです. * commitする際には必ずメッセージが必要だ,と覚えておこう. !! ファイルやディレクトリを新規に追加する ディレクトリ(dir1)を新たに追加したい場合は, 8< % svn mkdir dir1 >8 のように,'''svn mkdir'''とすること.また,ファイル(a.txt)を新たに追加したいときは, リポジトリに反映させるために 8< % svn add a.txt >8 のように'''svn add'''とすること.ただし,'''これらが真にリポジトリに登録追加されるのはcommitした時点'''なので注意. (commitするまではリポジトリは以前の状態のまま) !! ファイルやディレクトリを削除する 8< % svn remove a.txt >8 これも,実際に削除が反映されるのはcommit時なので注意. !! ファイルやディレクトリの名前を変更する 8< % svn move a.txt b.txt >8 これもcommitすると反映される. !! 変更内容のチェック 自分が変更したファイルと,リポジトリに登録されている最新版とを比較するには, 8< % svn diff a.txt >8 とする. !! 作業ログの閲覧 開発履歴は log オプションで確認できる.(ここで表示されるメッセージは,commit時に -m オプションで書きこまれたもの) 8< % svn log a.txt >8 !! 衝突とその解決 同じファイルを複数人が編集した場合,ファイルに不整合が生じてしまいます. これを衝突と呼びます.衝突を解決するための機能を解説します. ただし,本質的な解決は衝突を引き起こした開発者同士で話し合って解決する必要があるかもしれないことに注意しましょう.