4

Git サブツリーを使用してライブラリにマージしたプロジェクトがあります。ライブラリとプロジェクトの間でいくつかのマイナーな変更をプッシュおよびプルしました。

その後、ライブラリの最終的なホームとなる新しいリポジトリが作成されました。これには、私のプロジェクトと基本的に同じバージョンのライブラリ コードが含まれていますが、おそらく 1 つまたは 2 つのマイナーな変更が加えられています。さまざまな理由から、以前のライブラリのホームと直接の Git 履歴を共有していません (以前のライブラリのクローンではありません)。

私が今やりたいことは、新しい場所からライブラリをプル/プッシュするようにプロジェクトを変更することです。これが初めて発生した場合は、マージの競合も解決する必要がありますが、この場合、変更は些細なものであり、後でやり直すことができます。

これを行う最善の方法は何ですか?

プロジェクトのライブラリのコピーを削除してから、古いリモートとブランチと一緒に削除しようとしました。次に、新しい場所からサブツリーの追加などを試みました。これは機能しているように見えましたが、プロジェクトからライブラリにプッシュバックしようとすると、致命的な不良オブジェクト エラーが発生します。

私が試したアプローチには欠陥があると思います-おそらく共有された歴史の欠如に関係しています-しかし、それを修正する方法や何を知るために何が起こっているのかを十分に理解していません.この問題に対する「適切な」アプローチはあるべきです。

[更新: 質問を編集して少しわかりやすくしました - 少しあいまいでした]

4

3 に答える 3

1

おそらく、元のライブラリリポジトリにプッシュバックできるライブラリのバージョン(変更を加えたライブラリツリーのみ)を使用して、別の作業ブランチ(またはリポジトリ)を設定する必要があります。

したがって、元のリモートリポジトリにプッシュするには、最初に、リモートでコミットとして表示されると予想されるものをローカルで準備します。これを実現するためのさまざまなワークフローがあります。プロジェクトでの作業中に、最初にライブラリの変更をライブラリ専用の特別なローカル作業ブランチにコミットし(そのブランチはライブラリの元の履歴を継承する必要があります)、次にマージしますライブラリを含むこのブランチは、プロジェクト作業ブランチ(ライブラリがサブツリーである場合)に変更するか、プロジェクト作業ブランチから専用のライブラリ作業ブランチに変更をマージします。次に、必要に応じて、専用のライブラリ作業ブランチを元のリモートリポジトリにプッシュできます。

したがって、基本的に、最初にローカル専用の作業ブランチを作成して、元の履歴を継承します。

git branch MY_LIBFOO REMOTE_BRANCH_LIBFOO

(REMOTE_BRANCH_LIBFOOは、関心のあるローカルでストローされたリモートブランチであり、git fetchによって更新されます)

次に、ワークフローに従って、ライブラリへの変更が作業ブランチMY_LIBFOOにあることを確認します。そうすれば、次のことができます。

git push original_libfoo MY_LIBFOO:TARGET_BRANCH_REMOTELY

このようにして、何が起こっているのかについて明確な考えがあります。

于 2010-07-27T12:59:09.870 に答える
1

新しいプロジェクトのクローンを作成してみてください。次に、あなたのものをリモートとして追加して実行します

git remote update

これにより、プロジェクトからすべての参照が取り込まれます。今する

git cherry-pick <sha1>

新しいプロジェクトで必要な社の。それが私が考える最も簡単な方法です。

また、git はマージのために共通の履歴を必要としないことも知っておく必要があります (ただし、最初のマージはあまり適切ではありません)。つまり、私が言ったことを実行するだけで、チェリーピッキングの代わりに履歴をマージできます。おそらく競合が発生します。マージを開始したら (もしそうなら) git mergetool、3 方向差分を使用し、その使用方法を理解することをお勧めします。

于 2010-07-12T04:40:33.827 に答える
1

ライブラリをプロジェクトのサブモジュールとして参照していない理由はありますか?
(サブモジュールの本質を参照)

あなたの場合の利点は、サブモジュールのアドレスを簡単に変更できることです。

于 2010-07-22T06:27:36.780 に答える