ローカルのGitBucketをGitHubに移行する(その1)
- ローカルサーバのGitBucketで管理していたリポジトリをGitHubに移行したい
- リポジトリ本体は clone して push すれば事が済むが、ユーザ名やメールアドレスが同じとは限らない
- また、データベースで管理されている Issue などはそう簡単にはいかない
- あんまり頑張りすぎずに、できる範囲で移行した際の作業記録(その1)
その2とその3はこちら。
背景
とある事情にて、ローカルのGitBucketをGitHubのプライベートリポジトリに移行することになった
自宅サーバの構成管理をAnsibleでやってるんだけど、Ansible Playbookのリポジトリを自宅サーバのGitBucketで管理しているので、自宅サーバが壊れたらバックアップから引っ張ってこないと再構築できないよな…。
— kWatanabe (@WWatchin) 2020年10月10日
Ansible Playbook だけでも、GitHubのプライベートリポジトリに外出しするか。
GitHub はリポジトリの移行機能を持っていたり、極端な話 clone して push したら済むので、そう難しくない。でも、PostgreSQL に入っている Issue とか、 pull request とかはどうすりゃいいか分からん。
移行ツールとか無いか、いろいろ漁ってみたもののコレといったものが出てこない。なんとかならんものか。
最低限守りたいモノ
とりあえず、あんまり頑張りたくないので、最低限守りたいものを整理する。
プルリクは、たまたまオープンのものが無かったので、特に意識はしていない。
【2020/10/11訂正】 Issue だけだと、Issue 番号がずれてしまうので、プルリクも入れてやらないとダメだった。
リポジトリ
フルミラーの取得
リポジトリの完全なミラーを取得する。
まずは単純に clone して。
$ git clone <リポジトリのURL>
ブランチを確認して。
$ cd <cloneしたディレクトリ> $ git branch -r | grep -v "\->" | grep -v master origin/issue103
見つけたブランチも引っ張ってくる。
$ git branch --track issue103 origin/issue103 $ git branch issue103 * master
多分大丈夫だと思うけど、fetch と pull もしておく。
$ git fetch --all $ git pull --all
おっけー。
ユーザ情報を GitHub のものに移行
ユーザ情報(AuthorとCommitter)が、ローカルとGitHubアカウントで齟齬があるので、コレを修正する。
齟齬とはいったものの、実態としてローカルのリポジトリでは、好き勝手にでっち上げたユーザ名とメールアドレスを使ってコミットしていたのでもうグチャグチャ。まずは、こいつを GitHub のそれに合わせて整える。
現状を確認する。
$ git log --pretty=full …(略)… Author: XXXX <XXXX@XXXX.com> Commit: XXXX <XXXX@XXXX.com> …(略)…
もし、GitHubのユーザ名が kwatanabe、 メールアドレスが kwatanabe@example.com だとすると、こうする。
$ git filter-branch -f --env-filter "GIT_AUTHOR_NAME='kwatanabe'; GIT_AUTHOR_EMAIL='kwatanabe@example.com'; GIT_COMMITTER_NAME='kwatanabe'; GIT_COMMITTER_EMAIL='kwatanabe@example.com';" HEAD Ref 'refs/heads/master' was rewritten
もし、ブランチがあるならそれぞれで同じ事をやっておく。
$ git checkout BRANCH Switched to branch 'BRANCH' Your branch is up to date with 'origin/BRANCH'. $ git filter-branch -f … (省略)
修正されたことを確認。
$ git log --pretty=full …(略)… Author: kwatanabe <kwatanabe@example.com> Commit: kwatanabe <kwatanabe@example.com> …(略)…
試しに push してみる
とりあえずこれでリポジトリは整った。試しにGitHubにプッシュしてみる。
GitHubでプラベートリポジトリを作る。このとき、「Add a README file」と「Add .gitignore」のチェックを外しておく。
リポジトリのPUSH先URLを変更する。
$ git remote set-url origin https://github.com/<ユーザ名>/<リポジトリ>
あと、GitHubのデフォルトブランチ名は master ではなく main に変わった*1ので、メインブランチ名を変更する。
$ git branch -M main $ git branch issue103 * main
PUSHする。
$ git push --all origin $ git push --tags
GitHubのコンソールに入って、リポジトリのブランチとタグがきちんと反映されてることを確認しておく。
あと、きちんとコミットとユーザが紐付き、いわゆる"草原"に反映されていることを確認する。
次回予告
単なるリポジトリの移行だけであれば、コレで完了。
Issue やら Release やらをコピーしたい場合は、GitBucket から どうにかしてぶっこ抜く必要がある。
これは以下の記事参照です。