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 し放題になります。