Hatak::Techlog

Verba volant, scripta manent.

Github 上のプロジェクトの Fork をプライベートな Git サーバで管理

github で管理されている OSS を利用するとき、少しカスタムして使いたいという場合があったりします。もちろん、fork すれば github 上で自分が push できる状態にはなりますが、カスタムしたバージョンを利用する範囲が社内だったりすると github 以外で管理したくなったりもします。

そこで、こんな感じの構成を目指して、github 上のプロジェクトの fork をプライベートな git サーバで管理してみました。

|プライベートなリモートリポジトリのメインブランチ|origin/master| |github のプロジェクトのメインブランチ|github/upstream|

事前準備として、プライベート git サーバには push できる空のリポジトリを作っておきます。 (gitosis の場合であれば、gitosis.conf にリポジトリ名を追加しておく感じでいけます)

まず、おおもとのツリーを github から clone して取得します。

$ git clone --origin github https://github.com/edavis10/redmine.git
$ cd redmine
$ git config -l
...
remote.github.fetch=+refs/heads/*:refs/remotes/github/*
remote.github.url=https://github.com/edavis10/redmine.git
branch.master.remote=github
branch.master.merge=refs/heads/master

ここでは master が github のメインブランチになっています。 今回はオリジナルの master を upstream という名前で扱うようにしたいので、ブランチ名を変更します。

$ git branch master
$ git branch -m master upstream
$ git branch upstream
$ git config -l
...
remote.github.fetch=+refs/heads/*:refs/remotes/github/*
remote.github.url=https://github.com/edavis10/redmine.git
branch.upstream.remote=github
branch.upstream.merge=refs/heads/master

これでおおもとの master は、ローカルでは github/upstream という名前で扱えるようになりました。 実際にこちらでカスタマイズするのは github/upstream のタグ “1.2.0″ をベースに使いたいので、ここから master ブランチを切ります。

$ git branch master 1.2.0
$ git branch master upstream

そして、プライベートな git サーバをリモートリポジトリ “origin” として追加します。

$ git remote add origin ssh://gitosis@git.example.jp/redmine.git
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
$ git config -l
...
remote.github.fetch=+refs/heads/*:refs/remotes/github/*
remote.github.url=https://github.com/edavis10/redmine.git
branch.upstream.remote=github
branch.upstream.merge=refs/heads/master
remote.origin.url=ssh://gitosis@git.example.jp/redmine.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

あとはプライベートリポジトリに push すれば完了です。

$ git push origin master
$ git push origin upstream

これで、origin/master に push/pull し放題になります。