諸所の理由からSVN環境をセットアップすることに.
SVN(Subversion)†
- CVSと似てるけれど,SVNが上位版と考えて良い.
- ソースコードの共有,ちょっとあこがれていた.
- ポート番号は3690番
VisualSVN†
サーバ†
- 今度は本格的に研究室で利用するため,サーバを用意
- RAID5で2TBあるWindows Server 2003にVisualSVN Server¬e{visualsvn-official};をインストール
- インストール自体はホスト名を指定して,ユーザに関しては「Windowsを利用する¬e{choice-user-admin:実際のインストールは英語だったが,VisualSVN側で作るか,Windows側の設定を共有するか,の2択};」と設定
- サービスとして即稼動
クライアント†
- TortoiseSVN¬e{tortoise-svn-official:TortoiseSVN, 2013-02-21閲覧};を利用
- デフォルトでインストールして日本語化する.
- VisualSVN¬e{visualsvn-official:VisualSVN, 2013-02-21閲覧};はVisual Studio¬e{visual-studio-plugin:2005/2008/2010/2012どれもOK, 2013-02-21時点};のプラグインとして利用可能なのだが,
- 結局TortoiseSVNが必要.
- 有料で,1ライセンス約5000円¬e{visual-svn-license-price:2009年時点で49$,10ライセンス以上で5%の割引,2013年時点でCommunity Licenseなら制限付きながら無料¬e{visual-svn-license-price-official:VisualSVN | Licensing, 2013-02-21閲覧};};かかる.
- Commit,UpdateのメニューがVisual Studioに現れるだけ.
- なので,費用対効果を考え諦めた.
トラブル†
- SVNサーバインストール後,管理画面にはWebアクセス用のURLが出る
- httpsで8443ポートを利用
- IE7やFirefoxでアクセスすると「信頼できないサイト」警告が出る.
- 当然信頼するので,例外追加処理を行う.
- その後,パスワードを要求されるが,これはドメインコントローラのユーザ名がそのまま使える*1.
- が,その後,403エラーといわれるページに飛ぶ.
- 少し悩んだが,これが正しい挙動.
- デフォルトのURLはエラーになる仕様で,レポジトリを作って,そのレポジトリ単位のページにアクセスしない限り,エラーになる.
クライアントがらみ†
アイコンのオーバーレイが壊れたとき†
アイコンのオーバーレイが消えたとき†
- 複数のリポジトリからチェックアウトしてあったプロジェクトどれでもダメだったので,ローカルの問題っぽい.
- 上記のアイコンリビルドを何度ためしてもダメ
- 再起動してもダメ
- 最後は再インストールした
- 一応うまく行ったけど原因は何?
- 別マシン,別リポジトリでも同一時期に起こった.proxyを通さないといけないというネットワーク環境は共通してたから,それが原因か?
- なんにしろ再インストールとはね...
REPORT (URL: '/svn/hogehoge/hogehoge'): Could not read chunk size: Secure connection truncated (https://some.where.repository.jp/ )†
- どうやら,SVNリポジトリに関する情報が壊れていた模様
- チェックアウトしたディレクトリ以下には .svn と言う,隠しフォルダが作られる
- その中のファイルを意図せず破壊してしまった模様.
- チェックアウトしなおしで解決した
- The information about the repository was broken.
- The checked out directory contains a hidden directory named .svn
- I accidentally damaged that directory
- When I re-checked out the directory, the problem disappeared.
TortoiseSVNのアイコンがおかしい†
- 時間の問題
- ファイルのコミット直後は,リポジトリと整合性が取れたと言う情報が,TortoiseSVN経由で反映されるまで時間がかかる.
- この場合はエクスプローラのF5(表示(V)→最新の情報に更新(R))で消える.
- ディレクトリの整合性
- Aというディレクトリ内のファイルBと,その子ディレクトリCの下のファイルDを編集
- 同時にコミットした.
- コミット直前には,ディレクトリA内で,ファイルBと子ディレクトリCに赤!が付いている.
- コミット後は,何故かファイルBは緑チェックに変わり,子ディレクトリCには赤!が付いたまま
- これもしばらく待てば良いのだが,結構時間がかかる気がする.
- この場合の解決方法としては,子ディレクトリCに入る
- そのディレクトリC以下に新しいディレクトリEを作る
- 表示が更新され,赤!が緑チェックに変わる
- ディレクトリEを消す
- 多分キャッシュの問題で,ディレクトリを作る際にキャッシュをクリアする作業が行われるのだと予想している.
- 本当にファイルがコミットされてない場合
- アプリケーションがファイルにロックをかける場合,編集中のファイルを,クローズする際にも情報が書き換わる
- 結果,コミットしたあとにも,ファイルに赤!が付いたままとなる.
- 確認するためには,TortoiseSVNの変更を確認メニュー(svn status コマンド相当)を実行して,ファイルに「Modified」印が付いていないか確認.
コミットしたら'subversion checksum mismatch'とエラーが出てコミットできない†
- 原因は不明だが,リポジトリで計算されたハッシュ値がリポジトリと作業ディレクトリでマッチしないと発生する模様
- 作業ディレクトリ下にある.svn/text-base ディレクトリの中身 file.hoge.svn-base というファイルがある.(fileとhogeは適当)
- このファイルが作業ディレクトリにおける最新リビジョンのコピーである
- こいつの中身を強制的に書き換えると,上記のようなエラーに陥る
- 結構面倒なので,下記リンクでも紹介されてるように,もう1回チェックアウトするのが吉
- 本来の作業ディレクトリをWorkAとして,下記ステップを実行
- 作業ディレクトリをもう1度別名でチェックアウト(WorkBとする)
- WorkAの編集されたファイル達をWorkBにコピーする
- WorkBからリポジトリにコミットする
- WorkAを一旦退避させる ←(*)
- WorkBをWorkAの位置にmoveし,WorkAを削除
- (*)は安全のために行ってるがWorkAを退避せずに削除してしまっても問題ない
- 参考subversion checksum mismatch - easy workaround | bur.gs¬e{subversion-checksum-mismatch-easy-workaround:subversion checksum mismatch - easy workaround | bur.gs, 2013-02-21閲覧};
コマンドライン (Command line interface on Windows)†
- 2011年10月11日にSVNが1.7になり,TortoiseSVNも同日1.7にバージョンアップした
- 1.7は下位互換性を廃止しており,1.7で作成した作業コピーには1.6以下のクライアントでアクセスすることができない
- TortoiseSVNだけ使ってる場合は問題ない
- Win32SVNも2011年10月15日付けで1.7対応版がリリースされた
- TortoiseSVNも1.7.3からcommand line interface が追加された
#stub
SVNのリポジトリを移動するコマンド†
- 例えば,Aと言うリポジトリにソースコードが入っており,Bと言うリポジトリでドキュメントがを管理していた場合
- リポジトリを一元的に管理するために統合したい.
- この時,リポジトリのAのソースコードが管理されてるディレクトリとリポジトリBのドキュメントが管理されてるディレクトリが完全に独立していればsvnadminコマンドを利用して統合可能
- 完全に独立とは,ディレクトリ名が,履歴に置いても重複することが無いことを言う.
#stub
OpenCVのリポジトリにアクセスするのに認証を求められる†
SVNのexternal属性†
Subversion のリビジョン番号をソースコードに含める†
- 本来ならリビジョン管理するソースコードでも、たまに身元不明のバイナリなんかができたりする
- 開発中だと、再現性のためにそのバイナリのリビジョンを知りたくなることがある
- そのために、ソースコード内にリビジョン番号を埋め込む方法
- svnversion というコマンドで特定のソースコードのリビジョン番号及び変更されてるか否かを調べられる¬e{kyab-subversion:Subversionでどのリビジョンをチェックアウトしたか調べる - kyabの日記, 2013-01-28閲覧};
- また、$Id$や$Revision$など、特定のキーワードを記述し、SVNのプロパティを変更することで、キーワードがリビジョンやコミット日時に書き換えられる。¬e{subversion-keyword:Subversion キーワードの展開 - とみぞーノート, 2013-01-28閲覧};
- TortoiseSVNで実現するためにはTortoiseSVNメニュー→Properties→New→Keywordsで出てくるメニューで置換したいキーワードにチェックを入れる
作業コピーのリビジョン番号をコマンドラインで調べる†
Subversion 1.7をCentOS(RH系Linux)にインストールする†
Pristine Text Not Present†
- svn pristince について¬e{pristine-translate-alc:“pristine”の検索結果(29 件):英辞郎 on the WEB:スペースアルク, 2013-02-21閲覧};
pristine
【形】
原始の、初期の、元の状態の◆【語源】16世紀にラテン語pristinus(初期の状態の)から。
- Subversion で作業ディレクトリにリポジトリをチェックアウトすると、作業ディレクトリのルートディレクトリに .svn ディレクトリという、管理情報を格納したディレクトリができる
- .svn ディレクトリの中を覗くと、wc.db というインデックス相当のデータベースと、各ファイルの原始状態を記録したファイル(pristine)がある。
- このpristineファイルたちは、リポジトリ内における絶対パスのsha1ハッシュ値として置かれており、そのファイルのがリポジトリ内にある状態のコピーがココに置かれている。
- 1ディレクトリ内のファイル数が膨大にならないように、pristineファイル達はsha1ハッシュ値の冒頭2文字で、00からffまでの256個のディレクトリに分類して保存されている
- sha1の値が衝突する場合に備えて、wc.db内には、各SHA1値が何回参照されてるか、情報が保存されている。
- "Pristine Text Not Present" というエラー¬e{pristine-superspace:Tortoise SVN – Pristine Text Not Present Problem | Super Space Trooper? - My Journey in Video Game Development, 2013-01-28閲覧};が出る場合は、このSHA1ハッシュ値が参照されてる値が狂ってしまってる場合で、それを治す方法は2つ。¬e{missing-pristine-files-svn:Missing pristine files in SVN working copy | About Git, SVN, and other VCS, 2013-02-21閲覧};
- なお、wc.dbは素のSQLiteデータベースなので、表示することが可能
$ sqlite3 .svn/wc.db
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
ACTUAL_NODE NODES PRISTINE WC_LOCK
EXTERNALS NODES_BASE REPOSITORY WORK_QUEUE
LOCK NODES_CURRENT WCROOT
sqlite> select local_relpath, revision, checksum from NODES;
|0|
file|1|$sha1$da39a3ee5e6b4b0d3255bfef95601890afd80709
- da39 で始まるsha1値は空っぽのファイル名に相当する。
- このsha1値が参照されてる回数が、2列目に相当し、これがなんかの折に、実態とミスマッチすると、上記エラーが発生する。
- 数値がずれただけではエラーにならないが、ファイルを削除するたびにこの値が減少して行き、最終的に0になると、エントリ自体がwc.db内から削除され、Pristine Text Not Present エラーが発生する。
Subversionに実行権限情報も保存する†
Subversion で黒歴史を修正する†
- 基本的に、Subversionは変なコミットしたら、黒歴史としてずっと残る
- サーバ側で svnadmin コマンドを使うことで、リポジトリをmodify できる
svnadmin create repo_new
svnadmin dump repo -r 1:9999 | svnadmin load repo_new
- rev 9999までは正しいコミット、rev 10000 が黒歴史コミット
- ここで、rev 10000 のコミットをやり直す
svn co $URL_REPO_NEW work
cd work
# ここで黒歴史を修正する
svn ci -m "黒歴史修正"
- 残りのリビジョンをダンプする
svnadmin dump repo -r 10001:HEAD --incremental | svnadmin load repo_new
- 参考:[Subversion]過去の分岐の歴史を修正する方法 - DQNEO起業日記¬e{how-to-modify-the-dark-history-of-svn:[Subversion]過去の分岐の歴史を修正する方法 - DQNEO起業日記, 2012-08-27発表, 2013-10-01閲覧};
- svnadmin には、他にもsvndumpfilter と言うコマンドもあるので、うまく使えば、直近のコミットならばもう少し簡単になかったコトにできる¬e{how-to-revert-the-latest-commits:[Subversion]直近のコミットをなかったことにする方法(レポジトリデータを削除) - DQNEO起業日記, 2012-08-26発表, 2013-10-01閲覧};
特定のリビジョンのコミットを取り除く†
restoring icon overlays from tortoise SVN†
- mainly described in ¬e{managing-overlay-icons-for-dropbox-and-tortoisesvn-and-tortoisegit:Gareth J M Saunders, Managing overlay icons for Dropbox and TortoiseSVN and TortoiseGit – View from the Potting Shed, 2015-03-22公開, 2017-01-19閲覧, Windows 7};
- Only 15 icon overlay can be used for Windows, when 4 are used for windows it self, only 11 are available for user.
- Now, Dropbox, one drive, tortoise SVN/Git will consume those 11 and when you run out of the vacant place, the icon just disappears.
- Open registry editor by typing regedit
- find HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers
- make sure you back up this key (do it at your own risk)
- rename those icon by alphabetical order
- The name dosen't have to be the same
- More than the name, the order is important
- put numbers or space so that your desired icon comes top of the list
- put latter alphabet sot those icons that you do not wish will come at the bottom of the list
- my items are as bellow
- 01_Tortoise1Normal
- 02_Tortoise2Modified
- 03_Tortoise3Conflict
- 04_Tortoise6Deleted
- 05_Tortoise7Added
- 06_Tortoise8Ignored
- 07_Tortoise9Unversioned
- 08_DropboxExt01
- 09_DropboxExt02
- 10_DropboxExt05
- 11_DropboxExt07
- EnhancedStorageShell
- Offline Files
- SharingPrivate
- x DropboxExt03
- x DropboxExt04
- x DropboxExt06
- x DropboxExt08
- x DropboxExt09
- x DropboxExt10
- x Tortoise4Locked
- x Tortoise5ReadOnly
- x OneDrive1
- x OneDrive2
- x OneDrive3
- x OneDrive4
- x OneDrive5
- x SkyDrivePro1 (ErrorConflict)
- x SkyDrivePro2 (SyncInProgress)
- x SkyDrivePro3 (InSync)
- notice those 'x' at the beginning of the list
- now restart the explorer (better to restart your computer)