18

これは非常に難解な質問なので、ここで最初から明確にしておくと、svn から git へ、git から mercurial へ、または mercurial から git への変換について話しているわけではありません。Mercurial が git および SVN とある程度相互運用できるようにする「クロスシステム」プラグインを利用することから生じた複雑な状況について話しています。

しばらくの間、私は hg-subversion プラグインを Mercurial に使用して、code.google.com のアップストリーム SVN リポジトリを「追跡」しました。このプラグインのおかげで、Mercurial はリポジトリが「関連」していると見なし、最後にリポジトリから取得した後に発生した変更のみを取得できます。これにより、プライベートの変更セット、ブランチ、タグなどを含む独自のプライベート Mercurial リポジトリを維持できますが、アップストリームの SVN リポジトリで発生した変更と定期的に同期およびマージされます。

アップストリーム リポジトリは、SVN から git にきれいに移動しました。はっきり言って、彼らはコミット ツリー全体、または少なくとも私が気にかけている default/master ブランチに影響を与える部分を持ってきたということです。

I am now in a situation where I have a Mercurial repository that is up-to-date merged with the very last checkin on the now-defunct SVN repository, and I want to start pulling in changes from the new upstream git repository, starting at the change that occurred just after the svn repository was moved to github.

I can use the wonderful hg-git plugin to pull changes from this repository, but as the current repository has no notion of being "related" to the git upstream repo, it will pull ALL changes, including all the changes whose mirror-image changesets are already present in my repository.

したがって、私が探しているのは、上流の git リポジトリに関連する hg-git を介して、Mercurial リポジトリに自分自身を考慮させる方法と、git リポジトリからのすべての適切なコミットを「既にプル済み」と見なす方法についてのアドバイスです。変更セットのパリティを維持する目的。

内部で hg-git がファイル .hg/git-mapfile を使用しているように見えます。これは、アップストリームの git とローカルの Mercurial リポジトリの間で変更セットをマップしていると思われます。これはおそらく手がかりです。

ローカルの Mercurial リポジトリを、基本的にアップストリームの git リポジトリのクローンとして開始したかのように動作する状態にする最も簡単な方法は何ですか?

(注: 新しいクローンで「最初からやり直して」プライベートな変更を適用するのは避けたいと思います。これは、自分のビルド/デバッグの目的でこのリポジトリの履歴の整合性を維持したいためです)。

4

3 に答える 3

5

以前にgitで似たようなことをしたことがあります。git->git の場合、私は git-merge --strategy=ours を実行することができました。これにより、現在のリポジトリは、マージされているものはすべてノーオペレーションであると基本的に信じるようになりました。

それを行う必要があるのは、すでにツリーにマージされていることがわかっている上流のすべてを表すブランチであり、ツリーへの何もしないスタイルのマージを実行してから、「実際の」マージで変更を取り込みます。

このサイトから:

https://www.mercurial-scm.org/wiki/TipsAndTricks#Keep_.22My.22_or_.22Their.22_files_when_doing_a_merge

次のようなコマンドを使用すると、上流のリポジトリにマージし、上流のすべてを無視することができるようです。

$ hg --config ui.merge=internal:local merge #keep my files

これにより、ダウンストリームをアップストリームと再同期できるようになります。

于 2011-09-21T14:15:56.947 に答える
2

Hg-git を使用して新しいアップストリーム リポジトリのクローンを作成し、Convert 拡張機能を使用して、古いローカル リポジトリのすべての変更を新しいリポジトリにつなぎ合わせます。実際、ローカルの Hg-git リポジトリをネイティブの Mercurial リポジトリにクローンし、上流の Git リポジトリから 2 段階のプルを使用することになるでしょう。

于 2011-09-21T17:58:47.573 に答える