2つのGitHubリポジトリがあります。
ファイルが最初のリポジトリにプッシュされたときに、ファイルを自動的に(おそらくフックやgithub APIを使用して)コミットして2番目のリポジトリにプッシュしたいと思います。
2番目のリポジトリは最初のリポジトリのクローンではありません。それらのフォルダレイアウトは必ずしも同じではなく、共通のファイルがたくさんあるだけです。
これを行う最も簡単な方法は何ですか?
HttpサーバーをインストールしたりPerlを習得したりする必要がない場合のボーナスポイント:)
堅牢で保守が簡単なものをお探しの場合は、 GitHub Webhooks を中心にソリューションを開発することをお勧めします。はい、HTTPサーバー、たとえば Node.jsサーバー をデプロイする必要があり、少量の開発が必要になります(要件はかなり具体的です)が、それは報われると思います信頼性が高く、メンテナンスの少ないものが必要な場合。それは、このファイルミラーリングのアプローチが、アプローチとセットアップの労力を考慮して、依然として正しいことであると判断した場合です。
ソースリポジトリ(GitHub上)をS1
、S2
...とし、(重複しない)ファイルセットをF1
、F2
...にミラーリングします。ターゲットリポジトリT
(GitHubでも)に送信され、対応するファイルは読み取り専用と見なされます。 Sn
とT
は相互に複製されていないように聞こえ、共通のコミットさえない可能性があるという点で、要件は珍しいです。この場合、これはプッシュ/フェッチではありません。シナリオ。また、ソースファイルの更新がコミットごとに1回行われること、またはグループ化されているが複製されない変更から分離されていることも保証されていないため、これはコミットの選択に関するものではありません。
レプリケーションのトリガーは、特定のファイルをS1
、S2
...にプッシュすることであり、それらのリポジトリの開発者クローンでのコミットではないため、クライアント側のフックは役に立ちません(そしてそれらは役に立ちません)維持するのが難しいかもしれません)。もちろん、GitHubは汎用フックを許可しないため、Webhookが最善のソリューションです。 S1
...から定期的にプルし、ロジックを実行してからTにコミットする別のポーリングクローンを検討できますが、これはWebhookと比較すると厄介に聞こえます。これにより、信頼性の高い配信、再生機能、適切な監査が可能になります。 -トレイルなど.
利点は、このタイプのセットアップをサポートするためのインフラストラクチャがすでに構築されているため、実際に作成する必要のあるコードが非常に小さい可能性があることです。 Node.js
タイプのセットアップを使用するとします。
X-Hub-Signature
検証を処理し、すべてのWebhookイベントに単純なイベントリスナーフックを提供します。 Sごとに1つのエンドポイントを設定することも、ファンを追加する方が簡単な場合もあります。Sn
をFn
にマップするローカルファイル(Gitリポジトリに保存)を用意します。X-GitHub-Event: Push
のハンドラーを登録し、repository/name
とcommits[]/modified[]
でローカルマップに一致するパスを調べます。utf-8
またはbase64
コピーを読み取ります。T
に再作成します。このアプローチにより、T
のローカルクローンを必要とせずにすべてを実行できます。ローカルクローンを使用する方が良い場合があります。最初にAPIメソッドを使用すると簡単に処理できることがわかります。
同様の問題がありました。プロジェクトのリポジトリと一般的なドキュメントのリポジトリの間でドキュメントファイルを自動的にコピーしたかったのです。 GitHubのWebhookをリッスンし、コミットを解析して、選択した宛先へのプルリクエストを作成するツールを構築しました。 オープンソース化しています https://github.com/livechat/copycat -任意のノードプラットフォームサーバーで使用できます。
[〜#〜] edit [〜#〜]:質問がGitHubに関するものであることがわかりました。私の答えは、ファイルにアクセスできる標準のgitリポジトリについてです。
2番目のリポジトリは最初のリポジトリのクローンであり、次のようなものを作成したと思います
git clone --bare first.git second.git
現在のディレクトリをfirst.git
リポジトリ内に変更し、second.git
をリモートとして追加します。
cd first.git
git remote add second ../second.git
次に、first.git/hooks/
という名前のファイルをpost-receive
フォルダーに作成します(すでにそこにあるpost-receive.sample
ファイルの名前を変更できます)
内容はこちら
#!/bin/sh
git Push second
これで、新しいコミットを最初のリポジトリにプッシュすると、最初から2番目へのプッシュがすぐに実行されるため、2番目もコミットを受け取ります。
2つのGitHubリポジトリだけでは(サードパーティサーバーがWebhookイベントをリッスンしない場合)、相互にミラーリングすることはできません。
Pushイベントを検出するには、1つのGitHubリポジトリに webhook を登録し、2番目のGitHubにプッシュする必要があります。リポジトリ。
これは、Webhookをリッスンするサーバーを持つことを意味します jsonペイロード 。
dustin/gitmirror
のようなツールが(Goで)役立ちます。