0

Mercurial (またはその他の DVCS) は、部分的に重複した履歴をどのように認識できますか? たとえば、細粒/粗粒。

Mercurial で、履歴が似ているが同一ではない 2 つのリポジトリを便利にマージする方法はありますか?

たとえば、一方の担当者には粗粒度のリビジョン 0、1、2 があり、もう一方の担当者には細粒度のリビジョン 0、0.1、0.2、1、1.1、1.2、2 があり、単一の履歴を考え出す場合は?

ブランチとヘッドの混乱ではなく、Mercurial について知っていることを試してみると、どのような結果が得られるでしょうか?

または、さらに手の込んだ
レポ 1: 0, 1, 1.1, 1.2, 2
レポ 2: 0, 0.1, 0.2, 1, 2, 3
マージ: 0, 0.1, 0.2, 1, 1.1, 1.2 2, 3

さらに詳細に

私が欲しいのは、ファイルの内容が同じであることを認識できるマージ、または履歴の 2 行が類似していることを認識できるマージですが、一方の行のすべてのバージョンがもう一方の行にあるわけではなく、次のようなものです。

o=o changesets with same file contents on different historical lines
o |  (line1) 
| |  changeset:   2:2a02e67e7b5d
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| o  (line2)
| |  changeset:   8:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   7:615416921e33
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.2
| |
| o  changeset:   6:a43a88065141
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.1
| |
| |
o=o changesets with same file contents on different historical lines
o |  (line1) 
| |  changeset:   1:93cbae111269
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:13 2012 -0700
| |  summary:     1
| o  (line2) 
| |  changeset:   5:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     1
| |
| o  changeset:   4:b51fbedc72e5
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.2
| |
| o  changeset:   3:45b7f64b2a23
| |  parent:      0:c80bc10826be
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.1
| |
| |
|/
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0

おそらく o=o ポイントで変更セットのマージが必要になると想像できます。

しかし、私はそれを自動的に認識させたいと思っています。

このような履歴がどのように作成されるかの例を次に示します。この例では考案されていますが、プロジェクトが粗粒度のコミットを必要とするときに、実生活で何か似たようなことが起こっていますが、細粒度のコミット (およびプロジェクトにリリースされた粗粒度のもの) を保持したい場合です。

[glew@mipscs587 ~/hack/hg-granularity] 900$ bash 12:39:54>. ./eg

% set verbose

% mkdir hg-repo
% cd hg-repo
% ./hg-repo
% hg init
% echo 0 > a
% hg add a
% hg ci -m0 a

% cd ..
% hg clone hg-repo fine
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% hg clone hg-repo coarse
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

% cd fine
./fine
% echo 0.1 > a; hg ci -m0.1
% echo 0.2 > a; hg ci -m0.2
% echo 1 > a; hg ci -m1
% cat a
1
% hg push default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 1 files
% hg glog
@  changeset:   3:fef4050e0162
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     1
|
o  changeset:   2:b51fbedc72e5
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.2
|
o  changeset:   1:45b7f64b2a23
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0


% cd ../coarse
% cp ../fine/a .
% cat a
1
% hg ci -m1
% hg glog
@  changeset:   1:93cbae111269
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0


% cd ../fine
% echo 1.1 > a; hg ci -m1.1
% echo 1.2 > a; hg ci -m1.2
% echo 2 > a; hg ci -m2
% cat a
2
% hg push default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 1 files
% hg glog
@  changeset:   6:089179dde80a
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   5:615416921e33
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:14 2012 -0700
|  summary:     1.2
|
o  changeset:   4:a43a88065141
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:14 2012 -0700
|  summary:     1.1
|
o  changeset:   3:fef4050e0162
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     1
|
o  changeset:   2:b51fbedc72e5
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.2
|
o  changeset:   1:45b7f64b2a23
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0


% cd ../coarse
% cp ../fine/a .
% cat a
2
% hg ci -m2
% hg glog
@  changeset:   2:2a02e67e7b5d
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   1:93cbae111269
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0

OK、これで、細かいレポに細かい粒度の履歴があり、粗いレポに粗い粒度の履歴があります。それらをマージしたいと思います。(粗いものは細かいもののサブセットであることを理解してください。そうでない例は簡単に思いつくことができます)。

粗い粒度の履歴をプッシュするだけで警告が表示されます。後でopushしますが、まずは別のクローンでマージしてみます。

% hg push default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
abort: push creates new remote head 2a02e67e7b5d!
(you should pull and merge or use push -f to force)

% cd ..

% hg clone coarse merge-fine-and-coarse
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% cd merge-fine-and-coarse/
./merge-fine-and-coarse/


% hg glog
@  changeset:   2:2a02e67e7b5d
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   1:93cbae111269
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0



% hg pull ../hg-repo
pulling from ../hg-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 6 changesets with 6 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)


% hg heads
changeset:   8:089179dde80a
tag:         tip
user:        Andy Glew <glew@mips.com>
date:        Thu Jun 21 12:40:15 2012 -0700
summary:     2

changeset:   2:2a02e67e7b5d
user:        Andy Glew <glew@mips.com>
date:        Thu Jun 21 12:40:15 2012 -0700
summary:     2

これがマージです。

変更セットのペアに注意してください: 8:089179dde80a | @ 変更セット: 2:2a02e67e7b5d および o 変更セット: 5:fef4050e0162 | o 変更セット: 1:93cbae111269 には同じファイルの内容があり、1 つは coartse から、もう 1 つは細かいリポジトリからのものです。しかし、Mercurial の履歴グラフはこれを反映していません。

% hg glog
o  changeset:   8:089179dde80a
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   7:615416921e33
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:14 2012 -0700
|  summary:     1.2
|
o  changeset:   6:a43a88065141
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:14 2012 -0700
|  summary:     1.1
|
o  changeset:   5:fef4050e0162
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     1
|
o  changeset:   4:b51fbedc72e5
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.2
|
o  changeset:   3:45b7f64b2a23
|  parent:      0:c80bc10826be
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:12 2012 -0700
|  summary:     0.1
|
| @  changeset:   2:2a02e67e7b5d
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   1:93cbae111269
|/   user:        Andy Glew <glew@mips.com>
|    date:        Thu Jun 21 12:40:13 2012 -0700
|    summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0


% hg diff -r 2a02e67e7b5d -r 089179dde80a

というわけでマージしてみます

% hg merge -r 8
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)


% hg ci -m'merge of fine and coarse at 2'

より良い - これは変更セットを示しています: 8:089179dde80a | @ changeset: 2:2a02e67e7b5d は収束点ですが、追加のダミーの changert が必要でした。

しかし、変更セット間の共通性は示されていません: 5:fef4050e0162 | o 変更セット: 1:93cbae111269

これが統合されたグラフです

% hg glog
@    changeset:   9:328db8187d31
|\   tag:         tip
| |  parent:      2:2a02e67e7b5d
| |  parent:      8:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:43:51 2012 -0700
| |  summary:     merge of fine and coarse at 2
| |
| o  changeset:   8:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   7:615416921e33
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.2
| |
| o  changeset:   6:a43a88065141
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.1
| |
| o  changeset:   5:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     1
| |
| o  changeset:   4:b51fbedc72e5
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.2
| |
| o  changeset:   3:45b7f64b2a23
| |  parent:      0:c80bc10826be
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.1
| |
o |  changeset:   2:2a02e67e7b5d
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
o |  changeset:   1:93cbae111269
|/   user:        Andy Glew <glew@mips.com>
|    date:        Thu Jun 21 12:40:13 2012 -0700
|    summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0

別のマージはどうですか?

% hg update -r 1
1 files updated, 0 files merged, 0 files removed, 0 files unresolved


% hg merge -r 5
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)


% hg ci -m'merge of fine and coarse at 1'
created new head


% hg glog
@    changeset:   10:cca7fec90d3f
|\   tag:         tip
| |  parent:      1:93cbae111269
| |  parent:      5:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:45:03 2012 -0700
| |  summary:     merge of fine and coarse at 1
| |
| | o    changeset:   9:328db8187d31
| | |\   parent:      2:2a02e67e7b5d
| | | |  parent:      8:089179dde80a
| | | |  user:        Andy Glew <glew@mips.com>
| | | |  date:        Thu Jun 21 12:43:51 2012 -0700
| | | |  summary:     merge of fine and coarse at 2
| | | |
| | | o  changeset:   8:089179dde80a
| | | |  user:        Andy Glew <glew@mips.com>
| | | |  date:        Thu Jun 21 12:40:15 2012 -0700
| | | |  summary:     2
| | | |
| | | o  changeset:   7:615416921e33
| | | |  user:        Andy Glew <glew@mips.com>
| | | |  date:        Thu Jun 21 12:40:14 2012 -0700
| | | |  summary:     1.2
| | | |
| +---o  changeset:   6:a43a88065141
| | |    user:        Andy Glew <glew@mips.com>
| | |    date:        Thu Jun 21 12:40:14 2012 -0700
| | |    summary:     1.1
| | |
| o |  changeset:   5:fef4050e0162
| | |  user:        Andy Glew <glew@mips.com>
| | |  date:        Thu Jun 21 12:40:12 2012 -0700
| | |  summary:     1
| | |
| o |  changeset:   4:b51fbedc72e5
| | |  user:        Andy Glew <glew@mips.com>
| | |  date:        Thu Jun 21 12:40:12 2012 -0700
| | |  summary:     0.2
| | |
| o |  changeset:   3:45b7f64b2a23
| | |  parent:      0:c80bc10826be
| | |  user:        Andy Glew <glew@mips.com>
| | |  date:        Thu Jun 21 12:40:12 2012 -0700
| | |  summary:     0.1
| | |
+---o  changeset:   2:2a02e67e7b5d
| |    user:        Andy Glew <glew@mips.com>
| |    date:        Thu Jun 21 12:40:15 2012 -0700
| |    summary:     2
| |
o |  changeset:   1:93cbae111269
|/   user:        Andy Glew <glew@mips.com>
|    date:        Thu Jun 21 12:40:13 2012 -0700
|    summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0

これは正しくないです。それは新しいヘッドを確立しましたが、私たちが望んでいたのは変更セットを示す何らかの方法でした: o changeset: 1:93cbae111269 は同じです。

OK、元のコースに戻します

% cd ../coarse


% hg push default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
abort: push creates new remote head 2a02e67e7b5d!
(you should pull and merge or use push -f to force)


% hg push -f default
pushing to /home/glew/hack/hg-granularity/hg-repo
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files (+1 heads)


% hg glog
@  changeset:   2:2a02e67e7b5d
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   1:93cbae111269
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0



% cd ../hg-repo/


% hg glog
o  changeset:   8:2a02e67e7b5d
|  tag:         tip
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:15 2012 -0700
|  summary:     2
|
o  changeset:   7:93cbae111269
|  parent:      0:c80bc10826be
|  user:        Andy Glew <glew@mips.com>
|  date:        Thu Jun 21 12:40:13 2012 -0700
|  summary:     1
|
| o  changeset:   6:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   5:615416921e33
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.2
| |
| o  changeset:   4:a43a88065141
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.1
| |
| o  changeset:   3:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     1
| |
| o  changeset:   2:b51fbedc72e5
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.2
| |
| o  changeset:   1:45b7f64b2a23
|/   user:        Andy Glew <glew@mips.com>
|    date:        Thu Jun 21 12:40:12 2012 -0700
|    summary:     0.1
|
@  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0



% echo This is not right
This is not right

私が欲しいのは、ファイルの内容が同じであることを認識できるマージ、または履歴の 2 行が類似していることを認識できるマージですが、一方の行のすべてのバージョンがもう一方の行にあるわけではなく、次のようなものです。

o=o changesets with same file contents on different historical lines
o |  (line1) 
| |  changeset:   2:2a02e67e7b5d
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| o  (line2)
| |  changeset:   8:089179dde80a
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:15 2012 -0700
| |  summary:     2
| |
| o  changeset:   7:615416921e33
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.2
| |
| o  changeset:   6:a43a88065141
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:14 2012 -0700
| |  summary:     1.1
| |
| |
o=o changesets with same file contents on different historical lines
o |  (line1) 
| |  changeset:   1:93cbae111269
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:13 2012 -0700
| |  summary:     1
| o  (line2) 
| |  changeset:   5:fef4050e0162
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     1
| |
| o  changeset:   4:b51fbedc72e5
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.2
| |
| o  changeset:   3:45b7f64b2a23
| |  parent:      0:c80bc10826be
| |  user:        Andy Glew <glew@mips.com>
| |  date:        Thu Jun 21 12:40:12 2012 -0700
| |  summary:     0.1
| |
| |
|/
|
o  changeset:   0:c80bc10826be
   user:        Andy Glew <glew@mips.com>
   date:        Thu Jun 21 12:40:11 2012 -0700
   summary:     0

おそらく o=o ポイントで変更セットのマージが必要になると想像できます。

しかし、私はそれを自動的に認識させたいと思っています。

ねえ、「認識」を忘れてください。手動で認識できるようにしたいのですが、Mercurial で表現します。

4

1 に答える 1

1

I don't think Mercurial can get the design pattern you are looking for. Mercurial tracks the difference from a parent changeset to a child changeset so it doesn't really care about the contents of a file as a whole. Even if your file at revision 2 on tree A and the file at revision 5 on tree B have the same contents they were descended from different parents and thus have a different way of storing how they were changed. I haven't looked too much into the mq extension but that is the only thing I can think of that can edit a tree's history enough to do what you want. Editing a tree's history is always a dangerous thing to do and it is rarely recommended.

Edit: I'm not too sure on this one either but the rebase extension might work for you as well.

于 2012-06-21T20:40:02.260 に答える