3

要するに、特定の内部リポジトリの存在を完全に認識しない外部 mercurial リポジトリを作成するにはどうすればよいでしょうか? 私は基本的に、サブフォルダー内の特定の .hg* の存在を無視し、外部のリポジトリーがその幸せな方法を続けられるようにしたいだけです。

別の言い方をすれば、互いに何の関係もない 2 つの Mercurial リポジトリが必要ですが、たまたま同じファイルを追跡しているだけです。はい - そのファイルへの編集は 2 回コミットする必要があります。しかし、この場合、それが私が欲しいものです。

バックグラウンド:

私は、mercurial が部分的なクローンを処理できないことを回避する過程にあり、ハックですが、うまくいくと信じています。Mercurial にチェックインされた巨大なプロジェクト ツリーがあり、請負業者がこのツリーの一部にアクセスする必要があります。サブリポジトリのアプローチについての私の理解では、既存のツリーにバックハックするのは難しいということです。とにかく、1 人の請負業者と協力できるようにするためだけに、すべての同僚にこれを強制したくありません。

私がやりたいことは、プロジェクト ツリー全体のクローンの 1 つまたは 2 つのフォルダー内に内部リポジトリを作成することです。次に、これらの内部リポジトリを請負業者にさらに複製する予定です。それは最善ではありませんが、うまくいくでしょう。彼が私にプッシュした後、私は内側のリポジトリに関係するファイルにマージし、外側のリポジトリに出てツリー全体をチェックインできます。理想的には、外部リポジトリの観点からは、何らかの魔法がい​​くつかのファイルを更新したように見えるでしょう。

問題は、mercurial が自分自身について知りすぎているように見えることです:)。たとえば、hg init、hg add *、および hg clone はうまくいきました。しかし、彼が彼の側に新しいファイルを追加し、私がそれを外部リポジトリに追加すると、(難読化された)次のようになります。

中止: パス 'foo/bar.txt' はリポジトリ 'foo' 内にあります

内部リポジトリの .hg の名前を別の名前に変更することで回避できますが、一般的に、このアプローチは手に負えなくなりつつあります。内部リポジトリを無視する hg stat にも問題があります。そして、外部リポジトリから実行しようとしている他のコマンドやその他のことは、一般的に壊れ続けています(請負業者と共有したフォルダーの1つにサブリポジトリがあると、多くの問題が発生しています)。

何か案は?

(私は 1 つの理論的な解決策を思いつきました。別のリポジトリ baz/ をファイル システムの別の場所に作成し、ファイル システムのシンボリック リンクを使用して、元のツリーからフォルダーをプルします。しかし、その後、特定のマシンに配線されています。 2 つのリポジトリを橋渡しするために、このアプローチが私が考えていない他の結果をもたらすのではないかと心配しています.外側の観点から内側のリポジトリをクロークする方が便利でしょう.)

ありがとう!

4

1 に答える 1

2

あなたが望むことをする方法はないと思いますが、サブディレクトリをサブリポジトリに変えるのはそれほど難しくありません。唯一の注意点は、ディレクトリがサブリポジトリになると、ディレクトリに新しい名前を付けることで、分割前と分割後の履歴を簡単に行き来できることです。

この例では、次のディレクトリ構造があり、各ファイルの履歴を少し偽造しました。

org
 + file1
 + dir
    + file2

ステップ 1 -convert拡張機能を有効にします。
ステップ 2 - ファイルマップを作成して、dir履歴を独自のリポジトリのルートに移動します。例:

include dir
rename dir .

ステップ 3 - convert を実行して、別の名前のディレクトリを作成します。 ステップ 4 - 新しいディレクトリを元のプロジェクトの下に移動します。
ステップ 5 - 元のプロジェクトから古いディレクトリを削除します。
ステップ 6 - 新しいサブリポジトリで、最新バージョンに更新します。
ステップ 7 - 元のリポジトリに.hgsub、新しいサブリポジトリを参照するファイルを追加します。
ステップ 8 - ファイルを追加し.hgsub、古いディレクトリを参照していたプロジェクト パスを修正してコミットします。

例:

hg convert --filemap filemap org sub
move sub org
cd org
hg remove dir
cd sub
hg update tip
cd ..
echo sub=sub >> .hgsub
REM Fix up other project paths referencing dir->sub.
hg ci -Am "Converted 'dir' to repo 'sub'."

これで、請負業者の履歴が維持され、競合することなくメイン履歴の古いバージョンまたは新しいバージョンに更新できます。before subexists に更新すると、Mercurialsubは null 親に正しく更新さdirれ、履歴に表示されます。歴史の先端に更新、dir消えてsub更新。

于 2012-04-07T01:05:29.987 に答える