2009-09-03 10 views
2

多くの人と同様に、いくつかのプロジェクトを含むいくつかのSVNリポジトリがあります。私はいくつかの理由から、これらのリポジトリの1つをMercurialに変換することを決めました。Mercurialリポジトリを2つの別々のリポジトリに分散

instructions located hereを使用してリポジトリを変換しました。新しいhg repoにはすべてが含まれています。すべての履歴と正しいタグ。変換はうまくいった。

今、私は2つのプロジェクトを「分岐させる」必要がありますが、私は両側の歴史を維持したいと思います。誤ってチェンジセットを他のリポジトリにインポートするのを防ぐために、これを適切に行う方法があるかどうかは疑問です。

明らかに、各リポジトリには現在の変更セットの履歴が同じであることは気にしません(実際にはこれが必要です)。私はちょうど彼らが今から別のリポジトリであることを何とか示したいと思っています...

更新:誰かが--forceで詳述できますか?どの時点でその旗が必要になりますか。 http://www.selenic.com/mercurial/hg.1.htmlで、 "pull"の下で、-f、--forceオプションは "リモートリポジトリと無関係でも実行する"と表示されます。しかし、リポジトリと無関係なものは何ですか??更新

....関連の私には、私は元のリポジトリからクローン化されているので、彼らは(またはかもしれない):私は何を防ぐためにしようとしている、1つのレポは、後に他のレポに引っ張られることを可能にされますしばらく時間がかかりました。 (これは今の場合です)問題を作り出すスクリプトを書きました。そして、(これはWindowsのバッチファイルだ)私が起こることを望んでいない、まさに実現:

@echo off 

REM - First, create two distinct repos. 
REM - Add some files to each. 

MD test1 
MD test2 

cd test1 
hg init 

REM - Do several writes and commits to give content to the repo. 

echo This is some text for test1 > test1.txt 
echo This iss some more text; blah blah; >> test1.txt 

echo Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sapien velit, hendrerit sit amet ultrices nec, malesuada a mauris. Mauris eget nisi sit amet diam sodales tristique nec at turpis. Nam viverra pulvinar est, quis accumsan nunc fringilla ut. Nullam eu massa sapien, ac molestie magna. Curabitur nec pharetra nibh. Pellentesque velit dui, placerat vel porta eget, malesuada vitae dolor. In a lectus vel sapien imperdiet fringilla quis eu odio. Donec pellentesque ante nec est iaculis a aliquam nibh varius. Vivamus sit amet dolor non lorem ullamcorper ultricies quis in risus. Mauris eget orci leo. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris ut lorem lacus. In hac habitasse platea dictumst. Mauris pellentesque purus non elit molestie vehicula. >> test1.txt 
echo This is another text file for test1 > test2.txt 

hg addremove 
hg commit -m"First commit on test1" 


echo Nunc mollis, neque vel tempus iaculis, eros erat egestas metus, vitae condimentum tortor tortor id sem. Integer ac ante quis nisl condimentum iaculis. Vestibulum et quam vel lectus porta ultricies. Donec ultricies dignissim sollicitudin. Morbi sit amet est urna, a bibendum felis. In aliquet, tortor nec consequat ultricies, sapien diam eleifend nulla, in ullamcorper eros sapien ac magna. Phasellus sit amet congue quam. Nulla gravida justo aliquam libero tristique non tempor nunc mollis. Suspendisse venenatis tincidunt massa, a tempus odio blandit non. Suspendisse egestas orci lorem. Curabitur bibendum nibh quis elit tempus id suscipit nisl viverra. Pellentesque placerat nisl at felis porta laoreet. >> test1.txt 
hg commit -m"second commit on test1" 

echo Nunc placerat cursus scelerisque. Sed ac magna lacus, quis facilisis elit. Praesent mattis purus in urna congue auctor. Fusce pellentesque scelerisque dictum. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus vulputate nunc quis ante laoreet posuere. Curabitur ante turpis, blandit vitae dapibus vitae, convallis at tortor. Sed augue leo, fermentum id consequat et, accumsan in neque. In pellentesque luctus nisi, ac sagittis nisl condimentum tincidunt. Cras nec dui vitae purus adipiscing consectetur id at mi. Vestibulum quis est vitae purus dictum mollis. Phasellus ultrices rhoncus eleifend. Sed sit amet euismod orci. Curabitur id turpis tortor, nec mollis neque. Praesent egestas augue vitae sem fringilla at molestie lacus venenatis. >> test1.txt 

hg commit -m"thrid commit on test1" 

echo Suspendisse nec porta velit. Donec aliquet mi vel felis tempor vehicula vitae interdum quam. Phasellus tempor orci at ligula adipiscing sagittis. Quisque faucibus accumsan dui vel facilisis. Pellentesque laoreet quam vel nisl mattis ac venenatis sapien suscipit. Nam eget dictum risus. Proin quam magna, volutpat quis congue vitae, dapibus et mi. Etiam tempus purus ut massa sodales sed cursus odio ultrices. Ut vel dictum urna. Fusce blandit dignissim nibh a tempus. Nullam libero arcu, feugiat vel sollicitudin vitae, lacinia pulvinar enim. Nulla hendrerit faucibus tortor, sit amet convallis velit vehicula ut. Cras leo sem, fermentum eu adipiscing non, bibendum et lacus. Nulla volutpat tortor non libero feugiat fermentum id quis sem. Vivamus lobortis nibh quis diam semper feugiat. Phasellus ac lobortis purus. Vivamus at mi sem. Quisque accumsan consequat placerat. >> test1.txt 

hg commit -m"fourth commit on test1" 

cd .. 

cd test2 
hg init 

echo Nala is a cat >> myCats.txt 
hg addremove 
hg commit -m"first commit on test2" 

echo Simba is a cat >> myCats.txt 
hg commit -m"2nd commit on test2" 

echo Nanoon is a cat >> myCats.txt 
hg commit -m"3rd commit on test2" 

cd .. 

REM ------------------------------------------------------------------------------------------------------------------------------------------------------ 

hg clone --pull test1 test-combined 

cd test-combined 
hg pull ../test2 

echo - 
echo You should have gotten a "abort: repository is unrelated" error. 
echo this is from attempting to pull test2 in to the test-combined. Can't without --force flag. 

echo This is another file for combined repo > combinedRepo.txt 
echo This should be unique to test-combined >> combinedRepo.txt 
hg addremove 
hg commit -m"1st Change to combined repo" 

echo Fusce lectus arcu, cursus et dictum et, ultrices ut magna. Cras ultrices leo ac arcu commodo auctor. Pellentesque commodo sem et elit euismod posuere. Nam cursus, nisl ut placerat tincidunt, diam ante congue felis, id facilisis sem eros nec augue. Phasellus vel interdum est. Nunc at tellus non dui aliquam placerat nec placerat augue. Vestibulum justo sem, laoreet et blandit eu, mollis a nibh. Cras convallis, turpis quis vulputate euismod, risus neque convallis dui, posuere eleifend dolor quam ut dui. Integer pharetra porttitor lorem, vitae commodo mi semper non. Duis ipsum nisi, vulputate vel cursus ut, consectetur eu tellus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Fusce lobortis quam molestie leo scelerisque blandit. Ut massa neque, dapibus rutrum porta et, molestie vitae augue. Mauris eu erat a turpis suscipit viverra. Praesent vitae ante non dui volutpat ullamcorper eu in nisl. >> combinedRepo.txt 
hg commit -m"2nd Change to combined repo" 

cd .hg 

rem - Replace the hgrc file where we blank out the default file. 
echo [paths] > hgrc 
echo default = >> hgrc 

cd .. 
cd .. 
REM - We are not back in the starting folder... 
REM ------------------------------------------------------------------------------------------------------------------------------------------------------ 

cd test1 
echo A third file to make yet another commit in the repo. > myThirdFile.txt 
hg addremove 
hg commit -m"a third file to make this (test1) different than test-combined" 
cd .. 

REM - Retry the pull - Same source but diverged repos. 
cd test-combined 
hg pull ../test1 

ECHO - 
ECHO The pull just executed (in test-combined) succeeded but we want to prevent this. 
ECHO Here is the log for test-combined 

hg log 

cd .. 
@echo on 

空のディレクトリを作成し、するには、コードブロック内のテキストを保存し、このを実行します。 cmdファイル。コマンドウィンドウを開き、ファイルに移動して.cmdを実行します。

あなたはログテキストの上に次のように表示されます:

は1つの ファイル(1頭)に1が変化して1つのチェンジセットを追加しましたが(実行が に頭を参照の頭はHG」、「HGマージ'to merge)

ログテキストには、2つのレポが実際に結合されていることが示されています。 私の理想的なソリューションでは、これはエラーまたは--forceフラグの要求をもたらしました。

更新(9/10/2009):hg convertは私が必要とするものでは機能しませんでした。

答えて

0

私の問題とは異なる解決策があるかもしれませんが、私は新鮮なレポを作成して物事をもたらしたスクリプトを書くことになりました。

スクリプトはMercurialの外にあったので、Mercurialは新しいチェンジセットID(最終的に私に新しいルートを与えた)を割り当て、基本的にリポジトリを分岐させました。私のスクリプトは、hg convertがしたことを(私が推測している)行いましたが、結果のリポジトリが異なると見なされるようなやり方でそれを行いました。私がそれらを再統合した場合(議論のために)、彼らはその出典を表していないでしょう。このチェンジセットは、この仮説再マージでmergeコマンドを実行するまで並列実行されていました。

+0

hg convert --config convert.hg.saverev = 1を使用するだけで、擬似クローンを "無関係"とみなすことができます(元のチェンジセットIDに関する情報を保持するだけでなく)。しかし、サーバー側のフックを使用する私の他の提案は、より直接的でクリーンです。 –

1

リポジトリをクローンし、新しいクローンから元のリモートリポジトリパスを削除するだけです(変更を元のリポジトリに戻すことは不可能です)。完全に独立した新しいリポジトリが必要です。

+0

あなたは.hgフォルダ内のhgrcファイルについて話していますか?私はこれをしました。私はこれが最初の一歩だと感じました。ありがとうございました。さらに何か? –

+0

あなたは行かなくてはなりません。 – Amber

+2

リポジトリが分岐するとすぐにもう一方にプッシュする唯一の方法は--forceを使うことです。だから間違ってやってはいけません。 – tonfa

2

filemapオプションを指定してhg convertを再度使用して、ファイルをフィルタします。

diverge>hg init repo 
diverge>cd repo 
diverge\repo>echo some text > file1.txt 
diverge\repo>hg ci -A -m "added first file" 
adding file1.txt 

diverge\repo>echo more text > file2.txt 
diverge\repo>echo 123 >> file1.txt 
diverge\repo>hg ci -A -m "some changes and new file" 
adding file2.txt 

diverge\repo>hg log 
1[tip] 0f37e61d075b 2009-09-11 10:35 +0200 wierob83 
    some changes and new file 

0 b04d9d12fb1d 2009-09-11 10:34 +0200 wierob83 
    added first file 


diverge\repo>cd .. 
diverge>echo include file1.txt > files-in-repo-one.txt 
diverge>echo exclude file1.txt > files-in-repo-two.txt 
diverge>hg convert --filemap files-in-repo-one.txt repo new-repo-one 
initializing destination new-repo-one repository 
scanning source... 
sorting... 
converting... 
1 added first file 
0 some changes and new file 

diverge>hg convert --filemap files-in-repo-two.txt repo new-repo-two 
initializing destination new-repo-two repository 
scanning source... 
sorting... 
converting... 
1 added first file 
0 some changes and new file 

diverge>cd new-repo-two 
diverge\new-repo-two>hg out ..\repo 
comparing with ..\repo 
searching for changes 
abort: repository is unrelated 

diverge\new-repo-two>hg push ..\repo 
pushing to ..\repo 
searching for changes 
abort: repository is unrelated <-- can't push because its an independent repo 

だから、それが働いている必要がありますが、(私は前に知りませんでした;)

diverge\new-repo-two>cd ..\new-repo-one 
diverge\new-repo-one>hg out ..\repo 
comparing with ..\repo 
searching for changes 
1[tip] 62119640bde6 2009-09-11 10:35 +0200 wierob83 
    some changes and new file 

二レポはまだ関連しているようです。

これが意図した動作かバグかどうかはわかりません。

更新:

作成SUP-リポジトリの1つが、まだ関連している場合は、元のリポジトリから引き出すことができます。これは、分岐プロセスが分岐の始めに分割セットを分割しない場合に発生します。これは、これらの変更セットには異なるサブレポジションで終了する必要があるファイルが含まれていないためです。したがって、新しいチェンジセットを作成する必要はありません。

+0

私はこれを試しました。関連ファイル(ok ...)のヒストリだけが含まれていましたが、強制フラグなしで他のhg変換されたリポジトリの1つから引き出すことができます。だから、これはうまくいかないようです... –

0

関連するリポジトリに関する質問の部分に答えるには:2つのMercurialリポジトリは、共通のルートを共有している場合、関連しています。

もっと正確には、2つのリポジトリAとBは、1つ以上のチェンジセットを共有する場合に関連しています。 AとBがチェンジセットXを共有しているとしましょう。「チェンジセットX」とは、ハッシュXを持つチェンジセットを意味します。ハッシュ値はチェンジセットのアイデンティティです。ハッシュ値は、親チェンジセットのハッシュ値、日付、コミッター、および変更自体から再帰的に計算されます。これは、AとBの両方がXの親チェンジセットを共有しなければならないことを意味します。このように続けて、AとBはチェンジセットXの祖先である共通のルートチェンジセットを共有する必要があります。

これは、関連している:共通のルートを共有する必要があります。あなたは通常、唯一のルートチェンジセットを持つことになりますし、あなたはこのようにそれを見ることができます:あなたのケースのために

hg log --rev 0 

、私の推測では、変換は、両方の変換で同じルートチェンジセットを作成したことがあります。両方のクローンのhg logで実際に関連していることを確認する必要があります。それはまた、なぜ彼らが関連しているかについて何かを伝えるべきです。

ファイルマップに実際に2つのコンバージョンの異なるサブツリーが含まれていると、リポジトリの関連性を確認できません。したがって、包含/除外ルールに重複があるため、最初の変更セットは両方の変換で同じになるでしょうか?

+0

私はあなたの投稿を理解しています。私は今晩それを試すつもりです。ありがとうございました。私は新しい情報をフォローアップします。 –

0

リポジトリの分岐は簡単です。ちょうどクローン/プッシュ/プルはあなたが合っていると思う。 Mercurialは、分岐したリポジトリを関連するものとみなします。関連するリポジトリからの引き継ぎを止める標準的な水銀の方法はありません。 "hg pull"はあなたが何をしているのかをあなたが前提にしています。

  1. 名前を変更したリポジトリバックにリポジトリ
  2. クローンの名前を変更します。分岐のリポジトリから不要なチェンジセットの全体の束が引かれるなら

    、次の方法で、あなたがしたくないチェンジをクリアすることができます元の名前、-rを使用して
    希望の頭を選択します。

  3. (オプション)混乱したリポジトリにあるヘッドを に分割してください。を失うことはありません。
  4. 名前を変更したリポジトリを削除します。

あなたの環境によっては、あなたが望むものを保証するために人物、ファイルアクセス権、および/またはWebサービスで何かをセットアップできる場合があります。

0

本当に人々がリポジトリを結合するのを防ぐには、結合解除されたヘッドを拒否するhg pushを信頼することはあまり信頼できません。シンプルなCDの一つ& & hg fetch two & & hg pushを静かにマージしてreposを結合します。これを避けたいのであれば、サーバーにpretxncommitフックを書くことができます(2つのreposのそれぞれに対して)、他のものだけであると知られている特定のチェンジセットをプッシュしようとする試みは拒否されます。