2012-01-31 8 views
6

私はDVCSが新しく、いくつかの概念や用語を誤解している可能性がありますが、これは私が達成しようとしているアイデアです。 BazaarまたはMercurialのいずれかがこれを簡単な方法でサポートしているかどうかを調べようとしています。不要なローカル履歴をBazaarまたはMercurialのメインリポジトリにプッシュすることを避ける

十分にテストされたコードを持つメインリポジトリがあります。それをローカルのリポジトリにクローンしたり(あるいはその用語が何であっても)、クローンしたり、ローカルのリポジトリにコピーしたり、毎回、ローカルで変更をコミットするコードを作業したり、時には複数回に分けているとします。

私はすべての私の変更やテストを行っていた後、私はメインリポジトリに入れてすべてのファイル、私は中にローカルにコミットし、中間バージョンのせずに数十の唯一の最新の(ローカル)コミットされたバージョンを取得したいですデバッグとユニットテスト。

私が読んできたことから、明らかに、ハーフベークされたバージョンの全履歴は、私がそれを押すとメインリポジトリに反映されます。いくつかのインターネット記事では、リベースがその問題に対処しているかもしれないと示唆しているようですが、リベースは分岐を避けるためにはより多くのコミットを回避するよりも分岐/マージ履歴を避けるように思われます中間バージョンの大きなセットの

答えて

5

いくつかのバザールオプション。

  1. 多くのローカルコミットを取り除きたい場合、実際には履歴を捨ててしまいます。これを行う1つの方法は、bzr uncommitコマンドです。例えば。

    bzr uncommit -rbranch:https://url_to_mainrepo 
    

    (あなたがメインのレポの改正に到達するまでrivisionsを捨てる。それが行われることになるものをお見せして、それを実行する前に、あなたに確認します心配しないでください)

    次に、あなたが行うことができます他のすべてとの新しいコミットは1つに崩壊しました。

  2. 通常、バザーはマージされたリビジョンを非表示にします。小さなコミットをマージされたリビジョンにロールアップする方法の1つは、メインリポジトリのローカルブランチ/チェックアウトを維持することです。その後、準備が整ったら、bzr mergeをローカルメインリポジトリクローンに変更して、マージされたリビジョンをコミットします。

    このようにして、すべての履歴は保持されますが、すべての小さなリビジョンは、マージリビジョンに整然とロールアップされます。必要に応じて履歴を見ることができます。ここで

は、マージされたリビジョンが表示されない方法の例である:ここで

$ bzr log 
------------------------------------------------------------ 
revno: 2 [merge] 
message: 
    summary of the things I did 
------------------------------------------------------------ 
revno: 1 
message: 
    some change on the mainline 
------------------------------------------------------------ 
Use --include-merged or -n0 to see merged revisions. 

がマージされたリビジョンを参照する方法の例です:バザールで

$ bzr log -n0 
------------------------------------------------------------ 
revno: 2 [merge] 
message: 
    summary of the things I did 
    ------------------------------------------------------------ 
    revno: 1.1.2 
    message: 
     my first step 
    ------------------------------------------------------------ 
    revno: 1.1.1 
    message: 
     my second step 
------------------------------------------------------------ 
revno: 1 
message: 
    some change on the mainline 
+0

あなたは「普通に」隠されているので、常に隠されているとは限りません。 ...オプション2を使用すると、マージとメインリポジトリへのコミットが完了した後、マージ前のローカルにコミットされた中間バージョンのファイル内容が間接的手段(ログファイルなど)を介してメインリポジトリにアクセスできるようになりますか? – Gigatron

+0

マージされたリビジョンを表示するかどうかの例を追加しました – AmanicA

+0

OK、コメントとメタデータはログに表示されますが、ハーフベークされたローカルチェックインされたバージョンの実際のファイルデータはメインレポ、正しい? – Gigatron

5

あなたが探しているキーワードは崩壊または(Mercurialの)またはスカッシュ(Gitリポジトリ)です。私はバザールでいつもの言葉が何であるのか分かりません。

Mercurialでは、histedit extension(Mercurial 2.3以降のバンドル拡張)を使用して、一連のチェンジセットを1つのチェンジセットに折り畳むことができます。サードパーティの機能の上位セットを提供しますcollapse extension

rebase extension(別の標準拡張)は、--collapseフラグと同じ機能を持ちます。リベースは通常不要なマージを避けるために行われますが、それは何とかcollapsing (and editing) changesets in Gitにも使用される必要があります。 Mercurialのhistedit extensionは、Gitのインタラクティブリベースコマンドの後にモデル化されています。

+0

残念ながら、Mercurial履歴編集拡張の多くは、メインラインから分岐しながら途中でマージするようなことをした場合に問題があります。 –

+0

残念ながら、Mercurialで 'hg histedit'や' hg collapse'を使ってフォルダーを変更すると、ファイルの名前変更に関する情報が失われ、名前が変更されたファイルの編集履歴が失われます。 (最近追加されたコンテンツ全体を含む新しいファイルのように見えます)。 – Iodnas

+0

@lodnas:これを 'hg histedit'で再現できません - これを引き起こす方法に関するバグレポートを提出してください:http://bz.selenic.com/(私は崩壊をテストしていません。同じように、サードパーティの拡張であり、標準のhistedit拡張よりもバグが多いかもしれません)。 –

1

を、これを持っていることによって処理されますメインリポジトリの別の "クローン"(すなわちbzr branch URL)をローカルに作成してから、複数のコミットで作業するローカルの機能ブランチを作成します。その作業をメインリポジトリに移動する準備ができたら、bzr mergeメインブランチにブランチをブランチします。それによりメインブランチに変更された作業ツリーが残され、それをコミットして公式のメインリポジトリにプッシュします。このコミットには、フィーチャーブランチからのリビジョン履歴が含まれますが、通常はbzr logやその他のログ履歴ビューには表示されません。

+0

名前付きブランチでも同様のことができます。追加のクローンを持たなくても構いません(デフォルトはMercurialのトランクのnmaeです)。 (CVSとSVNでも、あなたが尋ねたものではありません)。 "hg log -b default"を実行するために他のユーザを訓練する必要があるかもしれません。メインブランチの履歴だけを見て、すべての中間チェックインを持つタスクブランチは見ないようにします。 –

関連する問題