私のセットアップでは、ローカルの変更をプッシュする中央のHgリポジトリがあります。ローカルクローンで一連のローカルコミットがあり、変更を中央リポジトリにプッシュしたいとします。作成した「小さな」ローカルコミットをすべて含めずに、最終状態のみをプッシュするにはどうすればよいですか?
私が行った小さなローカルコミットのすべてで中央リポジトリの履歴を汚染したくないことがあるので、これが必要です。
私のセットアップでは、ローカルの変更をプッシュする中央のHgリポジトリがあります。ローカルクローンで一連のローカルコミットがあり、変更を中央リポジトリにプッシュしたいとします。作成した「小さな」ローカルコミットをすべて含めずに、最終状態のみをプッシュするにはどうすればよいですか?
私が行った小さなローカルコミットのすべてで中央リポジトリの履歴を汚染したくないことがあるので、これが必要です。
なぜあなたはそれをしたいのですか?小さな変更をコミットすると、何かを簡単に元に戻すことができます。1つの大きなコミットですべてを収集する場合、小さな変更を元に戻すのはそれほど簡単ではない可能性があります。
私はbjornに同意します(そして私は彼の答えを支持しています)、あなたがしていることは素晴らしい考えではありません.意味のある歴史は良いことです. あなたがそれについて話せないなら、あなたがやろうとしているのは、最後の変更セットをプッシュするだけではなく、それらすべての変更セットの組み合わせである新しい変更セットです. これを行う最も簡単な方法は、折りたたむ拡張機能を使用することですが、mq またはエクスポート/インポートでも実行できます。ここで重要なのは、複数の変更セットを 1 つに折りたたむことで、履歴を書き直し、既存の変更セットを削除して、それらを新しい結合された変更セットに置き換えることです。そうすることは、Mercurial を信頼に値するものにしている歴史の不変性に違反します。
拡張機能なしでこれを行う方法は、mercurial wiki ページConcatenatingChangesetsで説明されています。
このページには、 CollapseExtensionなど、hg 拡張機能を使用したいくつかの代替アプローチへのリンクもあります。
mq 拡張機能を使用して履歴を書き換えることができます。折りたたむリビジョンがリビジョン 5、6、7 で、7 がヒントであるとします。次の方法でこれを実現します。
# Import the revs you want to collapse into mq
# mq will create patches for each revision from 5:tip, with the name
# <local rev number>.diff
hg qimport -r5:tip
# Goto the first commit
hg qgoto 5.diff
# Fold in the other commits successively. Aside from shell magic, there is
# no command line way to specify multiple patches at once.
hg qfold 6.diff
hg qfold 7.diff
# Commit the new mq patch as a changeset of its own
hg qfinish 5.diff
現在、リポジトリには、以前のリビジョン 5、6、および 7 の内容を含むリビジョン 5 のみが含まれています。