web-dev-qa-db-ja.com

Mercurial履歴を削除

Mercurialで古いチェンジセットをデータベースから削除する方法はありますか?私は60GBのリポジトリを持っているので、クローンを作成するのはかなり大変です。特定の日付より前にすべてを切り取り、巨大なデータベースを片付けてほこりを収集したいと考えています。

52
Jake Pearson

あなたはそれを行うことができますが、そうすることであなたはそこにあるすべてのクローンを無効にするので、あなたが完全に一人で作業しているのでない限り、それは一般的に賢明ではありません。

Mercurialのすべての変更セットは、(特に)ソースコードの変更、メタデータ、および1つまたは2つの親のハッシュの組み合わせであるハッシュコードによって一意に識別されます。これらの親は、プロジェクトの開始までずっとリポジトリに存在している必要があります。 (その制限がないと、(まだ)利用できない浅いクローンができます)。

新しいチェンジセットのハッシュを変更することに問題がない場合(これにより、すべてのクローンが元の状態に戻ります)、コマンドで変更できます。

hg export -o 'changeset-%r.patch' 400:tip   # changesets 400 through the end for example
cd /elsewhere
hg init newrepo
cd newrepo
hg import /path/to/the/patches/*.patch

マージ変更セットを処理するには、おそらく少し作業を行う必要がありますが、それが一般的な考え方です。

hgをソースと宛先の両方のタイプとしてhg convertを使用し、splicemapを使用してそれを行うこともできますが、それはおそらくもっと複雑です。

より大きな問題は、60GBのソースコードをどのように入力するか、またはすべてのアドバイスに対して生成されたファイルを追加するかということです。 :)

27
Ry4an Brase

これを既存のリポジトリに対して直接行う簡単な/推奨される方法はありません。

ただし、Mercurialリポジトリを新しいMercurialリポジトリに「変換」し、convert.hg.startrevオプションを使用して、履歴を含める場所からリビジョンを選択することができます。

hg convert --config convert.hg.startrev=1234 <source-repository> <new-repository-name>

新しいリポジトリには、元のリポジトリから開始リビジョンの前の履歴を差し引いたものがすべて含まれます。

警告:新しいリポジトリには完全に新しいチェンジセットIDがあります。つまり、元のリポジトリとはまったく関係がありません。新しいレポを作成した後、すべての開発者は新しいレポのクローンを作成し、そのクローンを元のレポから削除する必要があります。

私はこれを使用して、社内で使用されている古いリポジトリをクリーンアップしました---filemapオプションと組み合わせて、不要なファイルも削除しました。

48
Gerd Klima