概要
GitLabのリポジトリをGitHubに移行する機会がありました。
その際に利用したシェルスクリプトを紹介します。
やりたいこと
GitLabのリポジトリをGitHubに移行しなければならなくなりました。
移行するリポジトリが数個であれば、手動でひとつずつリポジトリをクローンして、移行先のリモートリポジトリにプッシュするのでもいいです。ですが、今回の状況では、数十個のリポジトリを移行しなければならないため、手動でやるのはとても面倒です。
そこで、シェルスクリプトを利用してリポジトリを移行することにしました。
スクリプト
今回使用するスクリプトでは、GitLabからGitHubへのリポジトリの移行を対象にしています。しかし、リポジトリのクローンについては、git clone
コマンドを利用しているだけですので、GitLab以外のBitbucket等でも利用可能です。
利用したスクリプトを次に載せます。
#!/bin/zsh
# エラーが出た場合はスクリプトを終了する
set -e
USERNAME="GitHubユーザー名"
# URLを受け取り、URLの内容を元にGitリポジトリをクローンする
echo "Clone $1"
git clone $1
cd $(basename $1 .git)
# 100MBを超えるファイルがあった場合は終了
if [ $(find . -type f -size +100M | wc -l) -gt 0 ]; then
echo "100MBを超えるファイルがあります。処理を終了します"
exit 1
fi
# git lfsがある場合はgit lfsの設定を削除する
if [ -e .gitattributes ]; then
echo "Remove git lfs"
git lfs migrate export --include="*" --everything
rm $(basename $1)/.gitattributes
git add .
git commit -m "Remove git lfs"
fi
# ふたつめの引数としてリポジトリ名を受け取りGitHubにリポジトリを作成する
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer <APIトークン>" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/user/repos \
-d "{\"name\":\"${2}\",\"homepage\":\"\",\"private\":true}"
# 作成したリポジトリへプッシュする
echo "Push $2"
git remote set-url origin [email protected]:${USERNAME}/$2.git
# mainかmasterかを判定して、そのブランチにプッシュする
if git branch | grep -q main; then
git push origin main
else
git push origin master
fi
# 最後にGitHubのリポジトリURLを表示
echo "https://github.com/${USERNAME}/$2"
このスクリプトは次のように実行します。
./script.sh <リポジトリURL> <GitHubリポジトリ名>
スクリプトの処理自体は、リポジトリURLからリポジトリをクローンして、GitHubの新しいリポジトリにpushするというものです。
あらかじめ、スクリプトに設定する内容として、curlのHTTPリクエストで利用するGitHubのアクセストークンがあります。このアクセストークンを利用して、リポジトリを作成しています。リポジトリのプッシュ自体はあらかじめスクリプトを実行するマシンへ、SSHでのプッシュの設定を追加しています。
また、GitHubのリポジトリを作成するために、ユーザー名をあらかじめ設定しておく必要があります。
Git LFSを使っている場合でも、適切に移行できるようにしています。具体的には、Git LFSを利用している場合は、LFSの利用を辞めるようにしています。また、GitHubでは100MBを超えるファイルをプッシュできないため、その時はエラーを表示して処理を中止するようにしています。
さいごに
色々と作業を楽にするための自動化ツールとして、シェルスクリプトを利用しています。一度作ったきりであまり再利用はできていないので、気が向いたら今回のようにブログで紹介していければと思います。
他の方々の参考になれば嬉しいです。