0

基本的に、私が試したいのは、実験リポジトリのブランチからメインラインのクローンに hg リビジョンをプルすることです。しかし、サーバー側のメインライン リポジトリに直接プッシュできるように、ブランチ名を破棄したいと考えています。簡単な例を挙げるのがおそらく最善です:

hg init hg_mainline
pushd hg_mainline 
touch foo
hg add foo
hg commit -m 'foo'
popd
hg clone hg_mainline hg_experimental
pushd hg_experimental
hg branch bar_branch
touch bar
hg add bar
hg commit -m 'bar'
popd
pushd hg_mainline
hg pull ../hg_experimental
hg log

ご覧のとおり、メインラインには「branch: bar_branch」を含むリビジョンが含まれています。このリビジョンにブランチを持たせたくありません (つまり、デフォルトにする必要があります)。

これがrebase移植、または別のツールで履歴を書き換える必要がある場合は問題ありません。私はこれらの両方を試しましたが、うまくいきませんでした。最新のリビジョン ハッシュは、2 つのリポジトリ間で異なる場合があります。

したがって、hg_mainline の最上位リビジョンを次のようにしたいと考えています。

changeset:   1:xxxxxxxxxxxx
tag:         tip
user:        ...
date:        ...
summary:     ...

名前付きブランチなし。

繰り返しますが、ハッシュが hg_experimental から保存されていなくても問題ありません。

現在、Ubuntu PPA から hg 1.6.2+55-18e1e7520b67 を使用しています。

編集:

1.3.1も使用しました。両方で以下をテストしましたが、ここでの結果は同じです。

grep -v移植で動作しましたが、クラッジでのみ動作しました。

hg transplant -s ../hg_experimental 1 --filter "grep -v '^branch:'"

と:

hg transplant -s ../hg_experimental 1

hg export は、適切な grep の有無にかかわらず機能しませんでした。

変更セットのパッチは次のようになります。

# HG changeset patch
# User Matthew Flaschen <EMAIL>
# Date 1282942390 14400
# Branch bar_branch
# Node ID b8e36efea72642f0a0194301489d5c48f619a921
# Parent  85d9b9773d4ec09676dfcc4af89c142c46279444
bar

私は実験からエクスポートしました:

hg export 1 -o '/tmp/%b_%H_%R'

そして、メインラインにインポートしようとしました:

hg import /tmp/hg_experimental_b8e36efea72642f0a0194301489d5c48f619a921_1

次のエラーで失敗します。

abort: no diffs found

編集2:

前述のように、エクスポート メソッドは、ファイルが空だったという理由だけで失敗しました。--git空でないファイルでも正しく動作します。

4

2 に答える 2

3

最も簡単な解決策はhg export、実験的なリポジトリからhg importメインのリポジトリに使用することです。デフォルトでhg importは、パッチ内のブランチ情報は適用されません。欠点は、2 つのリポジトリで異なる変更セットとして表示されることhg incomingです。実験リポジトリでは、エクスポート/インポートしたばかりの変更が表示されます。したがって、これを行った後、実験リポジトリを削除して再作成する方がよい場合があります。さらに実験を行う予定がある場合。

編集:hg_mainlineリポジトリから:

hg export -r 1 -R ../hg_experimental | hg import -

EDIT2:からhg help diffs

ファイルの 2 つのバージョン間の変更を表示するための Mercurial のデフォルト形式は、GNU パッチや他の多くの標準ツールで使用できる GNU diff の統一形式と互換性があります。

多くの場合、この標準形式で十分ですが、次の情報はエンコードされません: (中略)

  • 空のファイルの作成または削除

テスト スクリプト内のテスト ファイルは空であるため、ファイルに何かを入力するか、--gitオプションを使用する必要がありますhg export

于 2010-08-27T19:13:38.817 に答える
2

移植拡張機能はすでにブランチ名を破棄しています:

cd hg_mainline
hg transplant -s ../hg_experimental 1

あなたのためにそれをすべきです。そうでないことがわかっている場合は、途中でいつでも変更セットの--filter変更を使用できます (おそらく を使用するだけですgrep -v)。

移植を回避し、ハッシュを保持するワークフローを考え出すことができれば、より良いことに注意してください。名前付きブランチを完全に避けると、これが簡単になります。おそらくブックマークを使用した匿名ブランチも同様に、またはより良く機能します。

于 2010-08-27T19:15:18.313 に答える