2009-05-11 10 views
4

私はMercurialを非常に大きなC++プロジェクトの開発に使用しています(インクリメンタルビルドは非常に高速ですが、最初からビルドするのに約30分かかります)。"branchy"開発モデルを使用した不要な再コンパイルの回避

私は通常、新しいブランチに「hgクローン」を使用して実装しようとしています。その日にはいくつかの新機能が開発されていて、新しい機能ブランチを待つのは非常に退屈です。建てる。

すでにビルドされている他のブランチのオブジェクトファイルを何とか再利用するためのレシピはありますか?

P.S. gitに同じリポジトリ内にブランチという名前のブランチがあり、ビルドシステムで既存のオブジェクトファイルを再利用できるようになりましたが、私はシンプルなMercurialブランチモデルを好んでいます...

+0

私は、複数のクローンが概要を保存するのに最適であることに同意します。しかし、Gitと同じように、Mercurialは同じクローンでいくつかの開発ブランチをサポートしていることに注意したいと思います。 –

+0

私が間違っていれば私を訂正してください。でも、gitのローカルブランチとしては便利ではないし、すぐに使えないのでしょうか? – pachanga

+0

@pachanga:まあ、私の指摘は、Mercurialは常に同じリポジトリに複数の開発ラインを持つことをサポートしているということです。それらは複数の頭部として現れる。だから私は別のレポから物を引っ張ってそれを見てから、私の仕事を続けることができます。私が準備が整ったら、私は2つのブランチをマージすることができます。または、私がそれを気に入らなければ、他のブランチを削除することができます。ブックマーク拡張(Mercurialにバンドルされています)では、必要に応じて頭に名前を付けることができます。しかし、Mercurial 1.3ではGitのようにネットワーク上でブックマークをブラウズしたりクローンしたりすることはできません。 –

答えて

2

私のLocalbranch extensionは、このユースケースの周りに部分的に設計されました。それは単一の作業ディレクトリを使いますが、gitよりも簡単だと思います。これは本質的に、複数のリポジトリクローンを1つの作業ディレクトリの下に維持するためのメカニズムです。

+0

ありがとう、私はそれを試してみよう! – pachanga

+0

ところで、私は少し失われています - 同じ仕事をしているように思われるブックマークの拡張子があります...違いを説明してください? – pachanga

+0

基本的な違いは、localbranchは作業ディレクトリの下に完全に別個のリポジトリクローンを作成しますが、ブックマークは単一の共有リポジトリ内の異なるリビジョンへのポインタです。ブックマークはもっとgitのようなものですが、hgリポジトリ形式ではgitのやり方で実際にガベージコレクションがサポートされていないため、クローンを削除できるようにリポジトリから「ブックマーク」ブランチを簡単に削除できません。異なるブックマークのリビジョンが混在するため、インスタンスhgログは奇妙に見えます。 – brendan

3

簡単な方法でビルドをスピードアップあなたのディスク上にローカルの "ビルドディレクトリ"を使用することができます。この方法で、このディレクトリにチェックアウトしてビルドを開始することができます。最初はフルタイムがかかりますが、その後はソースコードが変更されたファイルのみを再構築します(うまくいけば)。

1

Mercurialにはローカルの名前付きブランチもあります.hg branchコマンドを参照してください。

hgクローンを使用してブランチ開発を行うと主張している場合は、共有objフォルダのレポにフォルダリンク(ウィンドウのショートカット)を作成してみてください。これはhgクローンで動作しますが、私はあなたのビルドツールがそれを受け取るかどうかは分かりません。

それ以外の場合は、おそらく1つのフォルダにすべてのリポジトリを置いておいてください。objフォルダをそこに置いてください(ソース管理の下に置かないでください)。それを参照するには、相対パスを使用します。

+0

チップをありがとう。私はオブジェクトファイルのための別のディレクトリを共有することは本当に効果があるはずだと思います。 – pachanga

0

警告の単語:多くの.oシンボルテーブル(または同等のもの)には、ソースファイルの絶対パス名が含まれています。その他のファイルが変更された場合(または新しいディレクトリからパスが見えない場合)、デバッグ時に不思議に思うかもしれません。

4

(ほとんど)同じコードツリーのコンパイルを高速化する方法として、ccacheを使用することをお勧めします。それが動作する方法は、以下の通りです:キャッシュ(最大キャッシュサイズ)として使用すること

  • あなたはCCACHE_DIR環境変数を使用して場所を定義
  • あなたのコンパイラは、 ccache ${CC}または ccache ${CXX}に設定する必要があります

ccacheは${CC} -Eの出力とコンパイルフラグを取り、そのハッシュのベースとして使用します。コンパイラフラグ、ソースファイル、ヘッダーはすべて変更されていない限り、オブジェクトファイルはキャッシュから取得され、貴重なコンパイル時間を節約します。

このメソッドは、最終的に同じハッシュを生成するすべてのソースファイルのコンパイルを高速化します。プロジェクト間でソースファイルを共有すると、ccacheもそれらを処理します。

すでにdistccを使用していて、それをccacheとともに使用する場合は、環境変数をdistccに設定してください。

ccacheを使用すると、ソースツリーのコンパイルが10倍ほど高速化されました。

2

私はあなたのP.S.を見逃しました。あなたは同じリポジトリに複数の名前のついたブランチを持っているのが好きではなく、別々のクローンを好むところがあります。

私もやや大きなC++プロジェクトを持っていて、機能ごとのクローンワークフローがうまく機能しませんでした。まず、Vimのセッションを閉じて、クローンを作成したら(同じものの多く)ファイルを開いていなければなりませんでした。第二に、あなたが言ったように、多くのコードを不必要に再コンパイルする必要があります。第3に、私が押し込んだ場所と引っ張った場所を把握しておく必要があります。新しい機能を開始して新しい機能に着目すると混乱します。あなたがそれを知る前に、あなたは多くのクローンを持っていて、あなたのメインにプッシュバックする必要があるかどうかはわかりません。

あなたは間違いなく永久的なので、これを処理するために(私はあなたが知っているように)名前付きブランチを使用したくありません。あなたが必要なもの

はブックマークしている:https://www.mercurial-scm.org/wiki/BookmarksExtension

ブックマークは、あなたのレポで頭の命名を容易にすることにより、機能ごとに軽量(とそうでない場合は匿名)ブランチを作成することができます。これらのヘッドは通常は名前が付けられておらず、あなたは 'hg log'の出力を見たり、ある種のグラフィカルツールを使ってフィーチャーブランチの先端のリビジョン番号を見つけなければなりません。ブックマークでは、「my-cool-feature」や「bugfix-392」のような記述的な名前を付けることができます。

ブックマークのアイデアが気に入ったら、自分自身の拡張機能「タスク」もお勧めします。 http://bitbucket.org/alu/hgtasksこの拡張機能はブックマークのように機能しますが、いくつかの機能が追加されています。これにより、フィーチャーブランチ(今はタスクと呼ばれる)を作成し、不完全なタスクのプッシュを抑止することができます。一度にいくつかの機能ブランチがある場合に便利です。あなたは '私のクールな機能'の仕事をプッシュする準備ができていないかもしれませんが、 'bugfix-392'は準備ができています。タスクは一連のチェンジセットをトラッキングするだけでなく、1つの「ヒントチェンジセット」だけでなく、ブックマークでは実行できないタスクもあります。ワークフローの例は http://x.zpuppet.org/2009/03/09/mercurial-tasks-extension/です。

関連する問題