svkでリポジトリを2重に作るのはなぜですか?


http://mono.kmc.gr.jp/~yhara/w/?SvkTutorial
このページで
『これには決してコミットしてはいけません。 なんでかは知らないけどそういうもんだそうです。』
と言っている部分です。

できれば、svkの動作原理と一緒に説明してくださると助かります。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/10/20 11:10:03
  • 終了:2007/10/27 11:10:04

回答(3件)

id:ttamo No.1

たも回答回数175ベストアンサー獲得回数292007/10/20 13:04:44

ポイント27pt

svk 使っていないのですが、こういうことだと思います。

まず普通の svn がどうなっていて、svk がどう違うか思い出してみてください。

svn でも、本家とローカルコピーを持つわけです。で、両方のリビジョン番号は常に同じ意味を持ちます。

svk では、本家とローカルという、ふたつの svn リポジトリを同期させなくてはなりません。ローカルが単なるコピーではなく、自分でコミットできるリポジトリであるという点が svk の利点です。それでリビジョン番号が同じでも違うものを意味するわけですね。

さて、svn では svn diff とすればローカルへの変更 (未コミット) を確認することができます。.svn に本家のコピーがあるからです。

でも、svk のように手元でコミットしてしまった場合、本家との違いを調べるための元データは .svn には存在しないことになります。手元にあるのはローカルコピーではなく、ちゃんとした svn リポジトリであり、すでに変更はコミットされているからです。

では、本家リポジトリと手元リポジトリの違いをどう見るか。いちいちネットワークを通すのであれば cvs 時代に逆戻りです。それで mirror が必要になる、というわけです。たぶん。

こんな推測ですが、どうでしょうか。

実際、Mercurial (hg) は二重にリポジトリを持ちません。ふつーに commit して pull して push です。これは最初から分散に関するデータを持つ構造になっているからでしょう。svk は svn というしがらみがあるので、こうなってしまったということではないかと思います。svk が独自フォーマットになっていればもっと単純にできたけど、svn co で取り出せる互換フォーマットなので面倒なことになってる、と。

svn   svk

本家  本家
|   |
.svn  mirror
|   |
wrkdir localrepo
id:urekat

svn: 本家 --- .svn --- wrkdir

svk: 本家 --- mirror --- localrepo --- wrkdir

mirrorとlocalrepoのリビジョン番号の増え方がバラバラだからってことですね。

(本家とmirrorのリビジョン番号は全く同じようにしておかなければならない<たぶん実装の都合)

もし間違ってmirrorにコミットしちゃうとどうなるんでしょうね。。。

2007/10/20 16:50:28
id:KUROX No.2

KUROX回答回数3542ベストアンサー獲得回数1402007/10/20 16:07:54

ポイント27pt

http://itpro.nikkeibp.co.jp/article/Keyword/20070207/261213/

>svkを使えば,ローカル・マシン上に全ソース・ファイルを含むリポジトリを保存し,

>オフライン時にも開発が続行できます。オンラインになったときに他のリポジトリと

>履歴を整合させて利用します。

localrepoからみると、mirrorが、svn で言うと本家に当たります。

そのためオフライン時にもコミットが可能です。オンラインになった時点で

mirrorと本家SVKつじつまあわせをします。



svk

本家SVK

 |

mirror

 |

localrepo

id:urekat

svkをインターネット上の外部リポジトリのキャッシュサーバとして使おうとしています。

この場合は、mirrorをreadonlyに設定しておけばlocalrepoは作らなくて良さそうですよね。

2007/10/20 16:54:02
id:znz No.3

znz回答回数193ベストアンサー獲得回数252007/10/20 21:26:29

ポイント26pt

svkの仕組み的に禁止されているというわけではありません。

自分専用のリポジトリを mirror していて、mirror のところから直接 checkout してそこに commit して使っていますが、commit するとすぐに mirror 元の方のリポジトリと sync するようなので、

- 余分な.svnディレクトリができない

- 過去の履歴もローカルにある

などの利点が不要なら直接 svn を使って checkout して使うのと変わらないので、そういう使い方はあまりされていないのではないでしょうか。

他にもオフラインになるときに作業用ブランチを作ってそっちに commi tするようにして、オンラインに戻ったときに作業用ブランチから push して mirror した方に戻るという使い方もあるようですが、まだそこまでしたことはないです。

  • id:ttamo
    http://svk.bestpractical.com/view/SVKFAQ には

    Committing anything to mirrored paths with svn will surely lead to breakage; merging with "svn merge" will cause subsequent "svk smerge" to lost merge history, resulting in possibly duplicated merges; all other operations should be safe.

    と書いてありますが、下のほうにある

    svk mirror --recover //Project

    で直せそうな気もします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません