Help us understand the problem. What is going on with this article?

GitHubとGitLab両方でプライベートリポジトリを並行運用してみよう

More than 1 year has passed since last update.

はじめに

年明け早々にGitHubにて無料ユーザーでもプライベートリポジトリ無制限という素晴らしいアップデートがありました。

新しい年とともに、新しいGitHub を

私は昨年2月よりリモートリポジトリでの個人開発を行っており、当時GitHubは無料無制限ではなかったため、GitLabを選択しずっと使い続けています。

無料プランで出来ることは依然GitLabの方が勝っていますが、ネームバリューや周辺ツール等の情報量ではやはりGitHubの方が大きいです。
参考比較記事: GitHub.com・BitBucket.org・GitLab.comの月額料金比較 + α

これを期にGitLabからGitHubへ乗り換えてみようかなと思いましたが、どちらか一方だけを使うのではなく、いっそ両方を同時に使っちゃおうという結論に至りました。
メリットとしてはどちらかが落ちていてももう一方を利用できるので可用性の向上が期待できます。

どちらもメンテや障害で止まる事もあるので。
昨年のGitHubの1日障害は記憶に新しいかと思います。
GitHubが障害を総括、43秒間のネットワーク断が1日のサービス障害につながった(2018年10月)
GitLab.comが操作ミスで本番データベース喪失。5つあったはずのバックアップ手段は役立たず、頼みの綱は6時間前に偶然取ったスナップショット(2017年2月)
GitLab復旧実況中継 #savegitlab(2017年2月)

運用にあたり

個人開発では私一人でリポジトリを運用するため、リモートに対して行う操作としては、

  • push/pull(fetch)
  • リポジトリの作成

ぐらいになります。

この2つの操作を現状と変わらない操作性で実現することを目標とします。

push/pull(fetch)

GitHub/GitLabへ同時にpush/pull(fetch)できればおっけーです。
これは単純に.gitconfigremoteurlを追加すればいいだけでした。
git push originで複数箇所にプッシュする

以下のコマンドでサクッとできます。

リモートリポジトリの追加
# git remote set-url --add <remote name> <repository url>
$ git remote set-url --add origin https://github.com/miso-develop/example

# ちゃんと追加されたか確認 
$ git remote -v
origin  https://gitlab.com/miso_develop/example (fetch)
origin  https://gitlab.com/miso_develop/example (push)
origin  https://github.com/miso-develop/example (push)

これでいつもどおりgit pushするだけでGitHub/GitLabの両方へ同時にpushできます。

リポジトリの作成

リポジトリは毎日ポンポン作成するわけではないので今までWeb画面ポチポチで行ってきましたが、GitHub/GitLabの両方で同じ操作をするのはさすがに億劫です。
これを期にCLIで操作するようにしてみました。

CLIツール

GitHubは「hub」、GitLabは「NARKOZ/gitlab」というCLIツールのシェアが高そうです。

他にもGitHubとGitLabとBitBucketマルチ対応のツールもありましたが、GitLabの最新APIに対応していないようでリポジトリが作れませんでした。
いけたらこれ一本でいきたかったです。
GitLab&GitHubを操作するためのCLIツール、hlbのご紹介

hub (GitHub CLI)

github/hub
ドキュメント

インストール

私はWindowsユーザーなのでGitHubのReleasesからzip落としました。
hub (Releases)

ユーザー名/アクセストークンを環境変数に

ちょっと抵抗がありますが、こうしないと%USERPROFILE%.config\hub(Unix系だと~/.config/hub)に平文ベタ書きのconfigファイルが作成されます。
環境変数に格納しておくとconfigファイルが作成されません。

環境変数設定(Windows)
$ setx GITHUB_USER <your user name>
$ setx GITHUB_TOKEN <your access token>

credential-managerとか使えないのかな…

httpsプロトコルを強制化

GitHub/GitLabともプロトコルはhttpsを使用しているので。

httpsプロトコルを指定(hub)
$ git config --global --add hub.protocol https

リポジトリ作成コマンド

以下のコマンドでリポジトリ作成。
-pオプションはプライベートリポジトリを指定です。
remote add originまでしてくれます。

リポジトリ作成(hub)
$ hub create -p <repository name>

NARKOZ/gitlab (GitLab CLI)

NARKOZ/gitlab
ドキュメント

インストール

Ruby製なのでgemを使います。

インストール(gitlab)
$ gem install gitlab

環境変数の設定

GitLabのAPIエンドポイント(固定値)とアクセストークンを環境変数へ埋め込みます。

環境変数設定(Windows)
$ setx GITLAB_API_ENDPOINT https://gitlab.com/api/v4
$ setx GITLAB_API_PRIVATE_TOKEN <your access token>

リポジトリ作成コマンド

以下のコマンドでリポジトリ作成。
デフォルトはプライベートリポジトリ。
レスポンスで色々情報表示されるので--only=web_urlでリポジトリURLのみ表示。

リポジトリ作成(gitlab)
$ gitlab create_project <repository name> --only=web_url

ただremote add originまでしてくれない…!
このコマンドめんどいし困った…

バッチでまとめてやっちゃおう

リモートリポジトリの追加時も一度git remote set-url --addする必要があるし、GitHub/GitLabのリポジトリ作成時にまとめて色々やっちゃうバッチを作りました。

このバッチをパスの通ってるディレクトリに置けばどこからでもコマンドがわりに打てます。
初回コミットまで終えてるローカルリポジトリにてcreaterepoとコマンドを打ってみてください。

createrepo.cmd
@echo off

:: get repository (directory) name
for %%A in (%CD%) do set REPOSITORY_NAME=%%~nxA
echo Repository name: %REPOSITORY_NAME%

:: create github
hub create -p %REPOSITORY_NAME%

:: create gitlab
for /f "tokens=1-12 skip=4 eol=+ delims=|" %%A in ('gitlab create_project %REPOSITORY_NAME%') do set REPOSITORY_URL=%%L
set REPOSITORY_URL=%REPOSITORY_URL: =%
echo %REPOSITORY_URL:.git=%
echo.

:: add remote gitlab
git remote set-url --add origin %REPOSITORY_URL%

:: push
git push -u origin master

echo Complate!
pause
exit /b


(おまけ)GitLabのリポジトリをGitHubに複製するバッチ

GitLabにのみあるリポジトリをGitHubに複製するバッチです。
リポジトリの複製に自分用に作ったものですが良ければお使いください。
パスの通ってるディレクトリに置いてご使用ください。

duphub.cmd
@echo off

:: remote確認
git remote -v
echo.

:: リポジトリ名取得
for /f "tokens=1-4 delims=/" %%A in ('git remote get-url origin') do set REPOSITORY_NAME=%%D
set REPOSITORY_NAME=%REPOSITORY_NAME:.git=%
echo %REPOSITORY_NAME%
echo.

:: リポジトリ名入力
set /p INPUTNAME=表示されたリポジトリ名でOKなら[Enter]を押して下さい。変更したい場合はリポジトリ名を入力して下さい: 
echo.
if %INPUTNAME%_ neq _ set REPOSITORY_NAME=%INPUTNAME%
echo %REPOSITORY_NAME%
echo.

:: GitHubにリポジトリ作成
for /f "tokens=1-2 delims=\" %%A in ('hub create -p %REPOSITORY_NAME%') do set REPOSITORY_URL=%%A
echo.

:: remoteにURL追加
git remote set-url --add origin %REPOSITORY_URL%.git
echo.

:: remote確認
git remote -v
echo.

:: push
git push -u origin master
echo.

echo Complete!
pause
exit

おわりに

以上のようにさくっとGitHub/GitLabを並行運用して快適なGitライフを送りましょう!

miso_develop
Google Homeの購入を機にITに目覚めた初心者非エンジニアです!分からないことがあったら相談したり一緒に考えたりしたいので是非ともフォローお願いします!
iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした