0

Mercurial(或任何其他 DVCS)如何识别部分重叠的历史?例如细粒/粗粒。

Mercurial 中是否有任何方法可以有效地合并两个历史记录相似但不相同的存储库?

例如,其中一个代表具有粗粒度修订 0、1、2,而另一个代表具有细粒度修订 0、0.1、0.2、1、1.1、1.2、2,并得出一个单一的历史记录?

当我尝试使用我所知道的 Mercurial 时,我得到的不是一堆乱七八糟的树枝和头?

或者更高级的
Repo 1: 0, 1, 1.1, 1.2, 2
Repo 2: 0, 0.1, 0.2, 1, 2, 3
Merge: 0, 0.1, 0.2, 1, 1.1, 1.2 2, 3

更详细

我想要的是一个可以识别文件内容何时相同的合并,或者可以识别两行历史记录是相似的,尽管并非一行中的所有版本都在另一行中,并给出如下内容:

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 点可能需要合并变更集。

但我想让它自动识别。

以下是如何创建此类历史的示例。在这个例子中是人为的,但在现实生活中,当一个项目需要粗粒度提交,但我想保留细粒度 ciommits(以及发布到项目的粗粒度内容)时,我正在发生类似的事情。

[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

好的,所以现在我在精细回购中有细粒度历史,在粗回购中有粗粒度历史。我想合并它们。(Firget 粗是细的一个子集:我可以很容易地设计出它们不是的例子)。

简单地推送粗粒度历史会发出警告。稍后我将对其进行操作,但首先我将尝试合并到一个单独的克隆中。

% 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 具有相同的文件内容,一个来自 coartse,另一个来自 Fine repo。但 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'

更好 - 这表明 o 变更集:8:089179dde80a | @ changeset: 2:2a02e67e7b5d 是一个收敛点,尽管需要额外的虚拟更改。

但它没有显示 o 变更集之间的共性: 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 变更集:5:fef4050e0162 | o 变更集: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

我想要的是一个可以识别文件内容何时相同的合并,或者可以识别两行历史记录是相似的,尽管并非一行中的所有版本都在另一行中,并给出如下内容:

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

我认为 Mercurial 无法获得您正在寻找的设计模式。Mercurial 跟踪从父变更集到子变更集的差异,因此它并不真正关心整个文件的内容。即使您在树 A 上的修订版 2 中的文件和树 B 上修订版 5 的文件具有相同的内容,它们来自不同的父级,因此具有不同的存储方式来存储它们的更改方式。我没有过多地研究 mq 扩展,但这是我能想到的唯一可以编辑树的历史以做你想做的事。编辑一棵树的历史总是一件很危险的事情,而且很少被推荐。

编辑:我也不太确定这个,但是 rebase 扩展也可能对你有用。

于 2012-06-21T20:40:02.260 回答