私もSubversionがブランチのマージに失敗し、Mercurial(およびGit、Bazaarなど)が正しいことを行うケースを探していました。
SVN Book は、名前が変更されたファイルが誤ってマージされる方法を説明しています。これはSubversionのに適用される1.5、1.6、1.7、および1.8!以下の状況を再現しようとしました:
cd / tmp
RM - 高周波のsvn - レポはsvn - チェックアウト
svnadminのは、SVNの作成- レポ
SVNチェックアウトファイル:/// tmpに/ SVN - レポはsvn - チェックアウト
CDのsvn - チェックアウト
mkdirトランクブランチ
echo 'さようなら、世界!' > トランク/ こんにちは。txt
svnトランクブランチを追加
svn commit - m 「初期インポート」。
svn copy '^ / trunk' '^ / branches / rename' - m 'Create branch。'
svnスイッチ'^ / trunk' 。
エコー'こんにちは、世界!' > こんにちは。txt
svn commit - m 「トランクで更新」。
svnスイッチ'^ / branches / rename' 。
svn rename hello 。txtこんにちは。en 。txt
svn commit - m 「ブランチで名前を変更」。
svnスイッチ'^ / trunk' 。
svn merge - '^ / branches / rename'を再統合
本によると、マージはきれいに終了するはずですが、更新trunk
が忘れられているため、名前が変更されたファイルに誤ったデータが含まれています。代わりに、ツリーの競合が発生します(これは、執筆時点でのDebianの最新バージョンであるSubversion 1.6.17で発生しています)。
---リポジトリURL間の違いを「。」にマージ:
hello.en.txt
C hello.txt
紛争の概要:
ツリーの競合:1
競合はまったく発生しないはずです。更新はファイルの新しい名前にマージする必要があります。Subversionは失敗しますが、Mercurialはこれを正しく処理します。
rm -rf /tmp/hg-repo
hg init /tmp/hg-repo
cd /tmp/hg-repo
echo 'Goodbye, World!' > hello.txt
hg add hello.txt
hg commit -m 'Initial import.'
echo 'Hello, World!' > hello.txt
hg commit -m 'Update.'
hg update 0
hg rename hello.txt hello.en.txt
hg commit -m 'Rename.'
hg merge
マージ前は、リポジトリは次のようになっています(からhg glog
):
@チェンジセット:2:6502899164cc
| タグ:ヒント
| 親:0:d08bcebadd9e
| ユーザー:Martin Geisler
| 日付:2010年4月1日12:29:19 +0200
| 概要:名前を変更します。
|
| oチェンジセット:1:9d06fa155634
| /ユーザー:Martin Geisler
| 日付:2010年4月1日12:29:18 +0200
| 概要:更新。
|
oチェンジセット:0:d08bcebadd9e
ユーザー:Martin Geisler
日付:2010年4月1日12:29:18 +0200
概要:最初のインポート。
マージの出力は次のとおりです。
hello.en.txtとhello.txtをhello.en.txtにマージする
更新された0ファイル、マージされた1ファイル、削除された0ファイル、未解決の0ファイル
(ブランチマージ、コミットすることを忘れないでください)
つまり、Mercurialはリビジョン1からの変更を採用し、リビジョン2からの新しいファイル名にマージしました(hello.en.txt
)。このような場合を処理するサポートリファクタリングするために、もちろん不可欠であり、リファクタリングがあり、正確にあなたがブランチ上で行うことになるでしょうものの一種。