0

マーキュリアルを使用。プライベート クローンで作業し、変更を加え、マスターにプッシュします。などで結構です。

(ちなみに、私は古典的な SCCS、RCS、CVS、SVN から BitKeeper、Git、Mercurial などの DVCS まで、多くのバージョン管理システムに精通しており、Monotone、Darcs、Bzr にも精通しています。 Perforce、... システム間の同等物と類似点を説明できる人のためにこれについて言及します。)

残念ながら、プロジェクトの他のメンバーは、私が頻繁にチェックインしていると考えています。私は「早めに頻繁にチェックインする」アプローチを使用しており、30 分に 1 回以上チェックインすることもあります。彼らは、ログにそれほど多くのチェックイン メッセージを見たくありません。

質問ではありません: 現在、私はほとんどの変更をブランチに加えることを習慣にしています (ただし、hg には遡及的なブランチがありません)。タスク ブランチをトランクにマージするときに、すべての変更を要約します。hg log -b default を使用すると、タスク ブランチを除外することができ、マージ メッセージが意味のある場合は問題なく動作します。これは私の質問ではありません。

質問ではありません: 同様に、履歴編集などを使用して細かい粒度の変更セットを削除し、プッシュされる変更セットだけが粗い粒度になるようにする方法を知っています。(ちなみに、最も簡単な方法は .hg ディレクトリを移動することです。) 履歴の編集は面倒ですが、できます。

MY QUESTION: 私の質問は: プロジェクトのマスター リポジトリにプッシュしていなくても、細かい粒度の変更セットとログ メッセージを追跡したいと考えています。Q: どうすればいいですか?

つまり、2 つのリポジトリを相互に追跡しながら、すべての変更をマスターにプッシュしないようにするにはどうすればよいでしょうか? できれば、タグの変更はプッシュされません。(ちなみに、私は「リビジョン セットにタグを付ける」と言うほうが好きです。チェンジセットはあまりにもパッチのように聞こえます。)

私が現在行っている方法は、a) プロジェクトのマスター リポジトリ、b) すべての詳細な変更を含む個人のマスター リポジトリ、c) 1 つ以上のワークスペースを持つことです。

どこ

a) プロジェクト マスター リポジトリのクローンを作成して、ワークスペースを取得します (hg clone を使用します、そうです)

b) 細粒度チェックインを使用してワークスペース クローンで作業する (私はこれを知っています)

c) ワークスペースのクローンから個人のマスターにプッシュする

d) そして、マスターにプッシュするときが来たら、履歴を編集してプッシュします。

2つのトラブル:

1) ワークスペースのクローンから個人のマスターへのマージまたはプッシュの競合 - より正確には、細粒度のチェックインを削除するように編集された履歴を持つマスター リポジトリから、細粒度のチェックインが保持されている個人のマスターにマージする際の競合。

2)プロジェクトマスターにプッシュしたものを個人マスターに記録したい。

--

非常に単純な例です。

きめ細かいチェックインを備えたタスク ブランチ。

o  changeset:   1022:
|  branch:      default
|  parent:      1017
|  parent:      1021
|  summary:     Merged task branch onto main, default, branch, with changes to FOO and BAR
|
o    changeset:   1021
|\   branch:      task-branch
| |  parent:      1020
| |  summary:     Merged default branch to task-branch, with changes to FOO and BAR
| |
| o  changeset:   1020
| |  branch:      task-branch
| |  parent:      1018:
| |  summary:     yet another fine grain checkin on a branch changing BAR for a second time
| |
o |  changeset:   1019
| |  branch:      task-branch
| |  parent:      1018:
| |  summary:     yet another fine grain checkin on a branch changing FOO
| |
o |  changeset:   1018
| |  branch:      task-branch
| |  parent:      1017
| |  summary:     yet another fine grain checkin on a branch changing BAR a first time
| |
|/
o  changeset:   1017
|  branch:      default
|  summary:     some other changeset on the default branch, i.e. trunk
|

プロジェクト マスターにプッシュされる編集履歴

o  changeset:   1018: ...changed checksumm because checksum seems to include history
|  branch:      default
|  parent:      1017
|  summary:     Merged task-branch onto main, default, branch, with changes to FOO and BAR. 
|               Removed task-branch-history from what got pushed to project repo, 
|               although may still be in personal repo
|
o  changeset:   1017
|  branch:      default
|  summary:     some other changeset on the default branch, i.e. trunk
|

問題は、更新されたプロジェクト マスターをマージしようとすると、次のようになる場合があることです。

o  changeset:   1019
|  branch:      default
|  parent:      1018
|  summary:     again, some other changeset on the default branch, i.e. trunk
|
o  changeset:   1018: ...changed checksumm because checksum seems to include history
|  branch:      default
|  parent:      1017
|  summary:     Merged task-branch onto main, default, branch, with changes to FOO and BAR. 
|               Removed task-branch-history from what got pushed to project repo, ]
|               although may still be in personal repo
|
o  changeset:   1017
|  branch:      default
|  summary:     some other changeset on the default branch, i.e. trunk
|

プロジェクト マスターの変更セット 1018 と個人マスターの変更セット 1022 は、ファイルの内容がまったく同じであるにもかかわらず、競合が発生します。

プッシュされるマージchangesrtのコメントを変更しないようにしました。少なくとも確実ではありません。

完全な履歴が変更セットに含まれているのだろうか。

また、履歴とログメッセージが異なっていても、同じファイルを認識できるマージツールがあるかどうかも疑問です。

4

1 に答える 1

3

一般に、履歴の編集を伴うワークフローはうまく機能しません。それは意図した作業モードではなく、うまく機能させるための努力はありません。

より良いオプションは次のとおりです。

  1. バージョン管理されたMercurial キュー ( hg qinit --create-repo) を使用すると、単一のパッチで複数のコミットを繰り返すことができます。プライベート パッチ リポジトリで完全な履歴を取得し、qfinished 全体のみを取得します。
  2. タスク ブランチと編集履歴をマージするのではなく、変更を単一のコミットとして再適用し、それをプッシュします。あなたの例ではhg diff -r 1017 -r 1021 | hg import、1018::1021 を含むすべての変更の合計である新しいコミット (1022) を作成します。 これは、変更セットをプッシュすることなく、きれいにマージしてプッシュ可能にするtask-branch必要があります。hg commit --close-branchタスクブランチでもできます
  3. 同僚に STFU を教えてください。;) 変更セットの粒度を高くすることは良い習慣であり、適応する必要があります。

また、タスク ブランチに名前付きブランチの代わりにブックマークを使用することを検討してください。同様に、新しいフェーズ機能により、タスク ブランチ (ブックマーク ブランチまたは古いスタイルの名前付きブランチ) の変更セットをマークして、secret誤ってプッシュされないようにすることができます。

于 2012-05-27T01:40:52.720 に答える