web-dev-qa-db-ja.com

2つのgitプロジェクトを互いに同期させるにはどうすればよいですか?

Pythonライブラリを開発しています。また、それを使用するコードも開発しています。現在、それらは同じgitリポジトリにありますが、ライブラリ部分を別のライブラリに分離したい最終的にそれをリリースする*準備のためのレポ。

ただし、2つのリポジトリを使用する適切な方法がわかりません。ライブラリには複雑なAPIがあり、開発するにつれて大きく変化する可能性があります。プロジェクトのこの段階では、通常、それらを使用するコードと同時に新しい機能を開発しています。以前の作業状態に復元する必要がある場合は、両方のプロジェクトを以前のコミットにロールバックする必要があります-各プロジェクトの最後の作業状態だけでなく、一緒に機能した最後の状態のペア。

私は非常に高度なgitユーザーではありません。これまでは、取り消し履歴としてのみ使用してきました。つまり、ブランチやマージを使用せず、いくつかの作業を行い、それをコミットし、さらに作業を行い、それをコミットするなどです。心配することなく両方のプロジェクトの同期を維持できるようにする、このワークフローの最小限の変更点は何でしょうか。

このプロジェクトは時間の経過とともにかなり複雑になる可能性があることを念頭に置きながら、私は1人の開発者であることを考えると、できるだけ単純なものにしたいと思います。アイデアは、各ステップでの混乱を最小限に抑えるために小さな変更を加えることです。

*ここで私が意味したことについてのメモ:プロジェクトはリリース可能な状態にどこにも近づいておらず、現在の状態に近いどこかにリリースするつもりはありません。 (この文脈での「リポジトリ」とは、「.git in it "、githubのパブリックリポジトリではありません。)別のリポジトリに配置することは、コードを自分で管理するために早い段階で実行する必要があると考えたため、この質問をしました。ベルンハルトからの回答は、これは事実ではないと私に納得させます。

5
Nathaniel

しかし、最終的にそれをリリースする準備として、ライブラリ部分を別のレポに分離したいと思います。

ライブラリを分離すると、いくつかの影響があります。それらの1つは他の人もあなたのライブラリを使用することです。その時点では、ライブラリの変更を単にロールバックすることはできません。このライブラリを使用する他のプロジェクトに予期しない影響を与える可能性があるためです。それを使用するプロジェクトでは、必要なものをロールバックできます。最悪の場合、ライブラリの異なるリリースバージョンを信頼できます。両方を同時にロールバックする場合、本当に別々のリポジトリがありますか、それとも単に生活を複雑にするだけですか?

ライブラリには複雑なAPIがあり、開発するにつれて大きく変化する可能性があります

APIを継続的に変更することは、長期的には大きな負担になります。インターフェイスは固定されています。他のプロジェクトへのダウンストリームの影響のため、インターフェースの変更は軽く取られるべきではありません。ライブラリの新しいバージョンをリリースするときは、下位互換性についても考慮する必要があります。

現時点であなたが唯一の開発者であることを考えると、次のいずれかを行うことをお勧めします。

  • インターフェースが十分に堅固であることがわかるまで、ライブラリーとプロジェクトを単一のリポジトリーに保管してください。その後、最初にリリースされたバージョンを作成できるときにそれを分離します
  • ライブラリとそれらを同時に使用するコードを開発しないでください。インターフェースが提供する各メソッドを個別にテストする単体テストを作成します。すべてが希望どおりに機能したら、それらを使用してプロジェクトの作業を開始します。
9
Bernhard

他の答えはプロセスに入りましたが、あなたが望むことをする方法のメカニズムについては触れませんでした。 gitでライブラリを使用する簡単な方法が2つあります-サブモジュールとして、または外部ライブラリ(nugetパッケージなど)として。

ライブラリが置かれているリポジトリにアクセスできる場合、サブモジュールを使用できます。サブモジュールは、ライブラリリポジトリ内の特定のコミットへのポインタです。そして基本的に、ライブラリのコードをプロジェクトソリューションにコピーし、通常どおりにコンパイルします。ライブラリを新しい(または古い)バージョンに更新したい場合は、ポインタを新しいコミットに更新してください。

外部ライブラリとして、古い「リリース」をすべて保持できるため、いつでもロールバックできます。たとえば、プライベートnugetフィードを使用すると、これらの古いバージョンのいずれかまたはすべてにアクセスできるため、必要なバージョンをインストールできます。

サブモジュールは扱いにくい場合があり、すべてのgit UIツールがそれらをサポートする(またはそれらを適切にサポートする)とは限りません。しかし、特に物事が頻繁に変化するため、かなりの柔軟性を提供します。

2
mmathis

私は本当にそれをする必要があるまでそれらを分離しません-あなたの場合、おそらくあなたがライブラリをリリースしてソースコードを公開したいときです。その分離を簡単にするために、ライブラリソースを他のディレクトリとは別のディレクトリに保持したい場合があります。ライブラリをリリースするときは、ライブラリのソースを新しいgitリポジトリにコピーし、その後、それを個別に維持して、変更が必要になったときに新しいリリースを作成できます。

何らかの理由でライブラリのソースの履歴をその新しいgitリポジトリに転送する場合:元のgitリポジトリをライブラリのgitリポジトリに複製し、その新しいリポジトリから他のすべてのディレクトリとその履歴を削除することが可能です。 。しかし、それは高度なgitの使用です。gitを十分に理解している誰かに手伝ってもらいたい場合があります。

0

ライブラリをリリースすると、APIは基本的に確定します。 APIはあまり変更しないでください。

それを行う方法はバージョン管理です。 APIの変更ではなく、機能の追加にはマイナーバージョン番号を使用します。下位互換性を維持するため。 APIが変更された場合は、メジャーバージョン番号を使用してください。

そうすれば、いつでも言うことができます。私のプログラムは、ライブラリxyzバージョン2.1.1、2.1.2、2.2.1で動作しますが、3.0.1では動作しません。

0
Pieter B

他の回答で述べられ、コメントで自分が認めたように、ライブラリのAPIはatmを解放するのに十分な安定状態にない可能性があります。 2つを分離する適切なタイミングを選択することが重要であると思います。そうしないと、メンテナンスの際に少し頭痛の種になるかもしれません。

問題を少し違った方法で見るべきだと思います。ライブラリを使用しているプロジェクトからライブラリを分離する場合、gitプロジェクトを維持する必要はありません同期では、メインプロジェクトをライブラリのパッケージと同期させる必要があります。これは、パッケージマネージャが作成されるものであり、異なるバージョンの異なるライブラリ間の依存関係を同期します。

ライブラリを分離することを決定したら、githubリポジトリ/ローカルソースからのコードとしてのライブラリの使用を停止し、代わりにパッケージリポジトリでリリースしてパッケージを使用することで、パッケージとして使用することをお勧めしますマネージャー。私はしばらくPythonで作業していませんが、 pip を調べる必要があると思います。

0
Mihai Coman