4

何かを保存するたびに、IDEをローカルでコミットするように設定しています。理想的には、バカの手探りが役に立つかもしれないまれな機会のために、無修正の記録を残したいと思います。しかし、ほとんどの場合、それは私の歴史を詳細に説明します。

その歴史を維持するための良い戦略を知りたいのですが、ほとんどの場合それを無視することができます。保存するたびにIDEが独自のスクリプトを実行しているので、それを制御できます。

私はMercurialにかなり慣れていないので、ここで必要なのは基本的な答えだけかもしれません。しかし、コミット、マージ、およびレポートするときに、これらの自動コミットをほとんど無視できるようにするために、実際にそれらを押しつぶさずに実行する必要があるすべての手順は何ですか?それとも私はあきらめてただ押しつぶしたほうがいいですか?

その履歴を保持する方が良いかもしれないことを示唆する高評価のコメントで押しつぶす方法に関する関連質問

編集-ここでの私のポイントは、Mercurialがすべての履歴を保持したい場合(私は同意します)、押しつぶそうとする可能性のあるものが表示されないように、その履歴をフィルタリングできるようにする必要があるということです。私は押しつぶしたくないのですが、私は自分の歴史を押しつぶしたようにできるだけ見えるようにするための戦略の助けを求めています(通常の使用では、常にではありませんが)。

4

4 に答える 4

4

リポジトリに詳細な履歴を保持したいが、「合理的な」リビジョンセットのみを含む理想的な履歴を作成したい(そしてエクスポートできるようにしたい)のですよね?お見舞い申し上げます。

解決策1:タグを使用して履歴内の興味深いポイントをマークし、それらの間のすべての厄介なビットを無視することを学びます。

解決策2: 2つのブランチを使用してマージします。ブランチで開発をdefault行い、並列ブランチを維持しますrelease。(あなたはそれを呼ぶことができますcleanが、実際にはあなたはリリースを管理しています)。チェックポイントを設定する安定した状態にあるときはいつでも、ブランチにdefault切り替えて、必要に応じて、現在の-の状態をバッチでマージします。に直接コミットしない場合は、マージの競合は発生しません。releasedefaultrelease

 (original branch) --o--o--o--o--o--o--o    (default)
          \              \        \
           r   ... ...  --r--------r        (release)

結果:の任意のリビジョンに更新してrelease、機能状態を期待できます。実行するhg log -r releaseと、選択したチェックポイントのみが表示されます。ログ全体を調べて、すべてがどのように発生したかを確認できます。欠点:releaseブランチはに依存しているため、ブランチdefaultを持ってこない限り、別のリポジトリにプッシュすることはできませんdefault。またhg glog -r release、マージが繰り返されるため、奇妙に見えます。

解決策3:上記のように名前付きブランチを使用しますがrebase、マージする代わりに拡張機能を使用します。リベースされたチェンジセットを完全に移動するのではなく、コピーするオプションがあります。--collapseまた、一連のリビジョンを1つのリビジョンに変換するオプションがあります。r1:tipファイナライズする一連のリビジョンがある場合は、次のようにからにコピーします。defaultrelease

hg rebase --source r1 --dest release --keep --collapse

これにより、その先頭にある1つのリビジョンが、releaser1からの先頭へのチェンジセット全体に相当しdefaultます。この--keepオプションは、破壊的な書き換えではなく、コピーにします。利点は、releaseブランチが希望どおりに表示されることです。きれいできれいであり、デフォルトのブランチをドラッグせずにプッシュできます。欠点は、そのステージをのリビジョンに関連付けることができないことです。したがって、中間リビジョンdefaultを本当に非表示にする必要がない限り、方法2をお勧めします(また、リベースは「ソース」リビジョンのすべての子孫を移動/コピーするため、複数のバッチで履歴を潰すのは簡単ではありません。)

これらはすべて、追加の作業を行う必要があります。Mercurialには、どのレブセットを押しつぶしたいかを知る方法がないため、これは避けられません。

于 2012-10-31T22:34:58.977 に答える
3

押しつぶそうとする可能性のあるものが表示されないように、その履歴をフィルタリングできるようにする必要があります

Mercurialにはこのためのツールがあります。見たくない場合は(でhg log、私は推測します)-これらのチェンジセットをrevsetsでフィルタリングします:

hg log -r "not desc('autosave')"

または、TortoiseHgを使用している場合は、[表示]-> [ツールバーのフィルター]に移動し、ツールバーに「notdesc('autosave')」と入力します。出来上がり、自動保存エントリはメインリストから非表示になります。

于 2012-10-27T05:04:29.437 に答える
2

Ctrl-S実際にリポジトリ履歴のすべての小さな変更をすべて保持しlog、重要な変更のサブセットのみを表示したい場合は、常にtag「重要な」変更セットを表示してから、にエイリアスlogを設定できlog -r tagged()ます。または、自動コミットされたメッセージにテキスト「autosave」を含めたり、自動保存されていないすべてのコミットを表示するを使用したりするなど、他のrevset記述子で同じ原則を使用することもできます。log -r keyword(autosave)


あなたの目標を達成するために、少なくとも私がそれに近づくと、私はmq拡張機能を使用し、保存するたびにパッチキューリポジトリを自動コミットします。次に、「ばかげた」を終えたら、hg qfinishプッシュできる単一のチェンジセットとしてパッチを適用できます。(いつものように!)単一の概念またはステップ(「保存ボタンの修正」など)を中心に変更を維持する必要がありますが、これにより、そこに到達するために必要なすべての小さなステップがキャプチャされます。

あなたはする必要があります

  • hg qinit --mqパッチキューリポジトリを初期化するために1回(fyi:に保存\.hg\patches\
  • hg qnew fixing-the-save-btnパッチを作成します

その後、IDEに保存するたびに

  • hg qrefreshパッチを更新するには
  • hg commit --mqパッチキューリポジトリに小さなチェンジセットを作成します

そしてあなたが終わったとき

  • hg qfinish fixing-the-save-btnパッチをプッシュするチェンジセットに変換します

これにより、保存するたびに変更されたものを使用して、リポジトリのローカルでの手探りが完全に保たれますが、変更セットが完了するとプッシュされるだけです。qpopまた、qpush作業中のアイテムを変更することもできます。

スカッシュ方式を試してみると、チェンジセットを押しつぶしたときに手探りの履歴が失われます。それか、「実際の」リポジトリとの間で作業を移行しようとして立ち往生するでしょう。これは、経験から言えば、やりたくないことです。:)

于 2012-10-26T19:22:39.603 に答える
1

ブランチを使用することをお勧めします。新しい機能を開始すると、新しいブランチが作成されます。そのブランチ内で、好きなだけ何度でもコミットできます。完了したら、機能ブランチをトランクにマージします。このようにして、基本的に履歴を2つのカテゴリに分類します。1つは細粒度(フィーチャブランチの履歴)で、もう1つは粗粒度(トランクの履歴)です。次のコマンドを使用して、どちらかを簡単に確認できますhg log --branch <branch-name>

于 2012-10-29T03:31:41.960 に答える