web-dev-qa-db-ja.com

プッシュされたファイルをあるGitHubリポジトリから別のリポジトリに自動的にコピーします

2つのGitHubリポジトリがあります。

ファイルが最初のリポジトリにプッシュされたときに、ファイルを自動的に(おそらくフックやgithub APIを使用して)コミットして2番目のリポジトリにプッシュしたいと思います。

2番目のリポジトリは最初のリポジトリのクローンではありません。それらのフォルダレイアウトは必ずしも同じではなく、共通のファイルがたくさんあるだけです。

これを行う最も簡単な方法は何ですか?

HttpサーバーをインストールしたりPerlを習得したりする必要がない場合のボーナスポイント:)

24
Drax

堅牢で保守が簡単なものをお探しの場合は、 GitHub Webhooks を中心にソリューションを開発することをお勧めします。はい、HTTPサーバー、たとえば Node.jsサーバー をデプロイする必要があり、少量の開発が必要になります(要件はかなり具体的です)が、それは報われると思います信頼性が高く、メンテナンスの少ないものが必要な場合。それは、このファイルミラーリングのアプローチが、アプローチとセットアップの労力を考慮して、依然として正しいことであると判断した場合です。

ソースリポジトリ(GitHub上)をS1S2 ...とし、(重複しない)ファイルセットをF1F2...にミラーリングします。ターゲットリポジトリT(GitHubでも)に送信され、対応するファイルは読み取り専用と見なされます。 SnTは相互に複製されていないように聞こえ、共通のコミットさえない可能性があるという点で、要件は珍しいです。この場合、これはプッシュ/フェッチではありません。シナリオ。また、ソースファイルの更新がコミットごとに1回行われること、またはグループ化されているが複製されない変更から分離されていることも保証されていないため、これはコミットの選択に関するものではありません。

レプリケーションのトリガーは、特定のファイルをS1S2 ...にプッシュすることであり、それらのリポジトリの開発者クローンでのコミットではないため、クライアント側のフックは役に立ちません(そしてそれらは役に立ちません)維持するのが難しいかもしれません)。もちろん、GitHubは汎用フックを許可しないため、Webhookが最善のソリューションです。 S1 ...から定期的にプルし、ロジックを実行してからTにコミットする別のポーリングクローンを検討できますが、これはWebhookと比較すると厄介に聞こえます。これにより、信頼性の高い配信、再生機能、適切な監査が可能になります。 -トレイルなど.

利点は、このタイプのセットアップをサポートするためのインフラストラクチャがすでに構築されているため、実際に作成する必要のあるコードが非常に小さい可能性があることです。 Node.jsタイプのセットアップを使用するとします。

  • デプロイ github-webhook-handler 。このかっこいい小さなライブラリは、GitHub Webhookのビルド済みハンドラーであり、HMAC X-Hub-Signature検証を処理し、すべてのWebhookイベントに単純なイベントリスナーフックを提供します。 Sごとに1つのエンドポイントを設定することも、ファンを追加する方が簡単な場合もあります。
  • SnFnにマップするローカルファイル(Gitリポジトリに保存)を用意します。
  • X-GitHub-Event: Pushのハンドラーを登録し、repository/namecommits[]/modified[]でローカルマップに一致するパスを調べます。
  • デプロイ node-github 、Node.js用の GitHub APIv の実装。
  • 一致するファイルごとに:
    • getBlob を呼び出して、Snからファイルのutf-8またはbase64コピーを読み取ります。
    • createBlob を呼び出して、そのファイルをTに再作成します。
    • Tに対して一連の呼び出しを行います getReference (現在のコミット)、 getTreecreateTree (ベースと新しいblobから新しいものを作成します)、 createCommit そして最後に pdateReference 。これは1つのワークフローです。衝突の少ないワークフローはブランチ/マージです。

このアプローチにより、Tのローカルクローンを必要とせずにすべてを実行できます。ローカルクローンを使用する方が良い場合があります。最初にAPIメソッドを使用すると簡単に処理できることがわかります。

enter image description here

9
javabrett

同様の問題がありました。プロジェクトのリポジトリと一般的なドキュメントのリポジトリの間でドキュメントファイルを自動的にコピーしたかったのです。 GitHubのWebhookをリッスンし、コミットを解析して、選択した宛先へのプルリクエストを作成するツールを構築しました。 Copycat schema オープンソース化しています https://github.com/livechat/copycat -任意のノードプラットフォームサーバーで使用できます。

9
konradk

[〜#〜] 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番目もコミットを受け取ります。

6
Klas Mellbourn

2つのGitHubリポジトリだけでは(サードパーティサーバーがWebhookイベントをリッスンしない場合)、相互にミラーリングすることはできません。

Pushイベントを検出するには、1つのGitHubリポジトリに webhook を登録し、2番目のGitHubにプッシュする必要があります。リポジトリ。

これは、Webhookをリッスンするサーバーを持つことを意味します jsonペイロード

dustin/gitmirror のようなツールが(Goで)役立ちます。

6
VonC