Differences between revisions 21 and 32 (spanning 11 versions)
Revision 21 as of 2008-05-02 08:47:55
Size: 4045
Comment: Spread the word about how MQ makes things easier ;-)
Revision 32 as of 2011-06-08 10:18:26
Size: 4849
Editor: proxy
Comment: added windows commandline for "Patch queue solution (using mq)"
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
''(See also [:EditingHistory])'' (See also: [[EditingHistory]], [[HisteditExtension]] (which provides an editor-driven UI for this), [[CollapseExtension]], [[RebaseProject]] (section ''Collapsing'')).
Line 6: Line 6:
Suppose you want to concatenate the last k changesets of a [:Repository:repository] Suppose you want to concatenate the last k changesets of a [[Repository|repository]]
Line 27: Line 27:
=== Solution (using hg only) === === Revert solution (using hg only) ===
Line 32: Line 32:
 This [:Update:updates] the [:WorkingDirectory:working directory] to revision S.  This [[Update|updates]] the [[WorkingDirectory|working directory]] to revision S.
Line 34: Line 34:
 changed to that of revision S, and that S becomes the [:Parent:parent]  changed to that of revision S, and that S becomes the [[Parent|parent]]
Line 52: Line 52:
 This [:Revert:reverts] the working directory to its contents at [:Tip:tip].  This [[Revert|reverts]] the working directory to its contents at [[Tip|tip]].
Line 57: Line 57:
 /!\ Revert does not preserve copy and move history.
Line 73: Line 74:
 [:Commit:Committing] these modifications creates a  [[Commit|Committing]] these modifications creates a
Line 90: Line 91:
 [[BR]]This assumes you want to get rid of your individual changesets (which are a dangling [:Branch:branch] in oldrepo) and just keep the combined changeset. newrepo will now just have the combined changeset.  <<BR>>This assumes you want to get rid of your individual changesets (which are a dangling [[Branch|branch]] in oldrepo) and just keep the combined changeset. newrepo will now just have the combined changeset.
Line 92: Line 93:
 /!\ This will strip out '''all''' other branches, not just the one dangling branch ''that you don't want.'' If you have other branches that you want to keep, specify their [:Head:head] revisions or [:NamedBranches:branch names] on the [:Clone:clone] call:  /!\ This will strip out '''all''' other branches, not just the one dangling branch ''that you don't want.'' If you have other branches that you want to keep, specify their [[Head|head]] revisions or [[NamedBranches|branch names]] on the [[Clone|clone]] call:
Line 96: Line 97:
 Or you can use the {{{strip}}} command provided by the [:MqExtension:Mercurial Queues Extension].  Or you can use the {{{strip}}} command provided by the [[MqExtension|Mercurial Queues Extension]].
Line 99: Line 100:
=== Alternative Solution (using mq) === === Patch solution (using hg only) ===
Line 101: Line 102:
Integrate the changesets you want to concatenate in a patch queue (verify you don't have pending patches there using {{{hg qseries}}}). [[BR]] Make a patch containing the changesets you want to concatenate. <<BR>>
'''~+{{{1: hg -R oldrepo export --git -r S:tip > patchfile}}}+~'''

Make a partial clone of the repository, up to and including the parent of S. This discards the patch changesets. <<BR>>
'''~+{{{2: hg clone -r "p1(S)" oldrepo newrepo}}}+~'''

Import the patch in the cloned repository as one changeset. <<BR>>
'''~+{{{3: hg -R newrepo import -m "Combine changesets S+1..S+k" patchfile}}}+~'''

=== Patch queue solution (using mq) ===

Integrate the changesets you want to concatenate in a patch queue (verify you don't have pending patches there using {{{hg qseries}}}). <<BR>>
Line 104: Line 116:
Pop all the patches but the first. [[BR]] Pop all the patches but the first. <<BR>>
Line 107: Line 119:
"Fold" unapplied patches, i.e. concatenate changesets. [[BR]]
'''~+{{{3: hg qfold $(hg qunapp)}}}+~''' [[BR]]
"Fold" unapplied patches, i.e. concatenate changesets. <<BR>>
'''~+{{{3: hg qfold $(hg qunapp)}}}+~''' <<BR>>
'''~+{{{3: for /F %i in ('hg qunapp') do hg qfold %i (Windows)}}}+~''' <<BR>>
Line 111: Line 124:
Reintegrate the folded patch in the repository. [[BR]]
'''~+{{{4: hg qdel -r qbase}}}+~''' [[BR]]
Reintegrate the folded patch in the repository. <<BR>>
'''~+{{{4: hg qfinish qbase}}}+~''' <<BR>>

Concatenating multiple changesets into one

(See also: EditingHistory, HisteditExtension (which provides an editor-driven UI for this), CollapseExtension, RebaseProject (section Collapsing)).

Problem

Suppose you want to concatenate the last k changesets of a repository

into a single, combined changeset

Revert solution (using hg only)

Execute the following steps:

1: hg -R oldrepo update S

  • This updates the working directory to revision S. Specifically, this means that the contents of the working directory are changed to that of revision S, and that S becomes the parent of the working directory.

2: hg -R oldrepo revert -r tip --all

  • This reverts the working directory to its contents at tip. Since the parent of the working directory is still S, this means that the combined contents of all changesets between S and S+k show up as the modifications in the working directory.

    /!\ Revert does not preserve copy and move history.

3: hg -R oldrepo commit -m "Combine changesets S+1..S+k"

  • Committing these modifications creates a new changeset "S+k (combined)", containing combined changesets S+1 to S+k.

4: hg clone -r tip oldrepo newrepo


  • This assumes you want to get rid of your individual changesets (which are a dangling branch in oldrepo) and just keep the combined changeset. newrepo will now just have the combined changeset.

    /!\ This will strip out all other branches, not just the one dangling branch that you don't want. If you have other branches that you want to keep, specify their head revisions or branch names on the clone call:

    • hg clone -r tip -r branch1 -r branch2 -r branch3 oldrepo newrepo

    Or you can use the strip command provided by the Mercurial Queues Extension. Note that if you're planning to use mq, there's a much more convenient way to do the above...

Patch solution (using hg only)

Make a patch containing the changesets you want to concatenate.
1: hg -R oldrepo export --git -r S:tip > patchfile

Make a partial clone of the repository, up to and including the parent of S. This discards the patch changesets.
2: hg clone -r "p1(S)" oldrepo newrepo

Import the patch in the cloned repository as one changeset.
3: hg -R newrepo import -m "Combine changesets S+1..S+k" patchfile

Patch queue solution (using mq)

Integrate the changesets you want to concatenate in a patch queue (verify you don't have pending patches there using hg qseries).
1: hg qimport -r S:tip

Pop all the patches but the first.
2: hg qgoto qbase

"Fold" unapplied patches, i.e. concatenate changesets.
3: hg qfold $(hg qunapp)
3: for /F %i in ('hg qunapp') do hg qfold %i (Windows)
This has the big advantage over the previous method that the commit messages will also be concatenated (separated by the * * * string). You can see the message using hg qhead and edit it using hg qrefresh -e.

Reintegrate the folded patch in the repository.
4: hg qfinish qbase
tip is now the concatenation of former changesets S:tip. There's no extra branch left, therefore no additional cleanup to do.


CategoryTipsAndTricks

ConcatenatingChangesets (last edited 2013-10-10 10:48:33 by RamiroMorales)