web-dev-qa-db-ja.com

Mercurialリポジトリの一部を複製できますか?

Mercurialリポジトリの一部を複製することは可能ですか?リポジトリが非常に大きいか、複数のプロジェクトまたは複数のブランチが含まれているとしましょう。リポジトリの一部のみを複製できますか?

例えば。 Subversionでは、trunkbranchesがあるかもしれません。トランク(またはブランチの1つ)のみを取得する場合は、[project]/trunkを要求するだけで済みます。 hgリポジトリのクローンを作成すると、トランクとすべてのブランチが取得されます。これは私が望まない多くの情報かもしれません。これを回避できますか?

または、1つのhgリポジトリに複数のプロジェクトを作成する場合、どうすればよいですか?つまりプロジェクトの1つを取得して、他のプロジェクトを無視するためです。

44
Nick

はい、できます。先に進んだことは間違いありませんが、後でここをさまよう人のために、 ConvertExtension のドキュメントに従い、簡単なバッチスクリプトを記述しました。

@echo off
echo Converting %1
REM Create the file map
echo include %1 > ~myfilemap               
echo rename %1 . >> ~myfilemap 
REM Run the convert process
hg convert --filemap ~myfilemap .\ ..\%1   
REM Delete the file map
del ~myfilemap                             
cd ..\%1
REM update the new repo--to create the files
hg update                                  

split.cmdのような名前を付けて、分割するリポジトリのディレクトリに配置します。たとえば、C:\repos\ReallyBigProjectがあり、サブフォルダがC:\repos\ReallyBigProject\small-projectであるとします。コマンドプロンプトで、次のコマンドを実行します。

cd\repos\ReallyBigProject
split.cmd small-project

これにより、より大きなプロジェクトからの改訂の関連する履歴のスライスを含むC:\repos\small-projectが作成されます。

convertはデフォルトでは有効になっていません。 .hg\hgrcファイル(私の例ではc:\repos\ReallyBigProject\.hg\hgrc)に次の行が存在することを確認する必要があります。

[extensions]
hgext.convert=
37

私の知る限り、それは不可能です。ただし、Subversrionと比較すると、リポジトリ全体のクローン作成は、SVNからのブランチよりも遅くなることはありません。

nderstandingMercurial からの引用:

多くのSVN/CVSユーザーは、関連するプロジェクトを1つのリポジトリでホストすることを期待しています。これは実際にはhgの目的ではないため、別の作業方法を試す必要があります。これは特に、リポジトリの1つのディレクトリだけをチェックアウトできないことを意味します。

ただし、ある種のメタリポジトリで複数のプロジェクトをホストする必要がある場合は、Mercurial 1.3以前で導入された Subrepositories 機能 ForestExtension を試すことができます。

17
Savageman

@ニック

「たとえば、Subversionでは、トランクとブランチがある可能性があります。トランク(またはブランチの1つ)のみを取得したい場合は、[プロジェクト] /トランクをリクエストできます。hgリポジトリのクローンを作成すると、トランクとすべてが取得されます。ブランチ。これは私が望まない多くの情報かもしれません。これを取得することを回避できますか?」

もちろんです。 hg clone -r <branch>を使用して、必要なブランチのみを取得します。ブランチがたくさんある場合は、それぞれに-r <branch>が必要です。 <branch>は名前付きブランチである必要はありません。名前なしのヘッド(またはブックマークを使用した名前付きヘッド)を複数持つことができますが、現在はプッシュ/プル/で表示されないため、まだ完全ではありません。クローン)。

MercurialなどのDVCSでは、ブランチが短命で、頻繁にマージされることに注意してください。ブランチをプルしても、他のブランチと共通の履歴が得られます。

16
quark

@ニックは言った:

「多くのホスティングサイトは1つのリポジトリしか提供していないため、これはかなり大きな省略です。svnを使用すると、メインのブランチから1つのブランチを取得するだけで、必要な数のリポジトリを効果的に作成できます。サブレポはハックのように聞こえます。」

サブリポジトリ(別名サブモジュール)は、「ナロークローン」ほど理想的ではありません。ただし、少なくとも1つのホスティングサイトのリポジトリに多数の個別のプロジェクトがある場合は、1つのリポジトリに複数のコードベースを含めることができます。これにより、プロジェクトの1つのリポジトリ/サブディレクトリの異なるセクションをスライスすることはできませんが、will複数のプロジェクトを管理できます。あなたがすることは、それぞれが空の(またはnull)チェンジセットをルートとする多くの名前付きブランチを持っていることです(つまり、共通のリビジョンはありません)。ブランチを追跡するのが少し面倒になる可能性がありますが、機能します。

例えば:

hg init
hg branch project-1
# Changes, commits, repeated as needed
hg update null
hg branch project-2
# Changes, commits, repeated as needed

これですべてのプロジェクトが表示されます。

> hg branches
project-2                      5:42c2beffe780
project-1                      2:43fd60024328

プロジェクトは無関係です(ただし、それらをマージすることはできます)。

> hg debugancestors
-1:000000000000 

最も便利なのは、必要なプロジェクトのみを複製でき、他のプロジェクトは混在させないことです。

> hg clone <repository> -r project-1

このグラフは次のようになります(hg log -qG):

@  5 | project-2 | {tip}
|
o  4 | project-2
|
o  3 | project-2

o  2 | project-1
|
o  1 | project-1
|
o  0 | project-1

これは、必要な数のプロジェクトに対して実行でき、それぞれをhg branchesでリストし、hg updateでプロジェクト間をジャンプします。名前付きブランチのサポートは完全ではないため、これにはsome注意が必要です。直感的に理解できるとは限りません(Mercurial 1.4のhg clone -uについて読んでください。1.4より前の動作は、クローン作成時には意外です)。しかし、それはします動作します。

6
quark

MercurialとGitは、リポジトリ全体のクローン作成のみを許可します。したがって、プロジェクトごとに独自のリポジトリを取得することをお勧めします。

Mercurialには forest extension があり、プロジェクトリポジトリの「フォレスト」を簡単に利用できます。この拡張機能は、各プロジェクトを個別のリポジトリに保持しますが、すべてのフォレストリポジトリをまとめて更新/プッシュ/プルするオプションを提供します。

5
notnoop

何年か後... Mercurialにhg clone -r branchnameを使用してブランチのみのクローンを作成するよう依頼することができます( Mercurial clone from a branch を参照)。 Googleの NarrowHG拡張機能 拡張機能を使用すると、ナロークローンを実行できます( Mercurialのリポジトリのサブフォルダーを複製するにはどうすればよいですか? 同様の質問の場合)。

2
Anon

この質問をしてから10年近く経ちますが、偶然この質問に出くわしました。

これを可能にする新しいMercurial拡張呼び出しスパースがあります。

0
Craig