subversionの始め方
はじめに
今回は、subversionというバージョン管理ツールを使う方法をまとめました。
バージョン管理ツールと言えば、gitそしてGitHubです。一方でゲーム開発等を行う上では、ソースコードに加えて、3Dモデルやテクスチャ画像といった重いファイルも管理しなければなりませんが、gitはそうしたバイナリファイルを高速に扱えません。また、GitHubは100mb以上のファイルを受け付けないという制約があり、そもそもコミットさえできません。そこでgitlfsという手段がありますが、料金が高く、またキャッシュを消すことが難しいなどの問題があり、個人的に使用は避けたいと考えました。
そこで今回は、ソースコードの管理はgitで行い、容量の大きいファイルの管理はsubversionを使い、gitとsubversionを併用してリポジトリ運用を目指します。
svnサーバーはめぼしいwebサービスがなかったので、GCPにサーバーを立てる実装になっています。また、このSVNサーバー1つで、いくつものリポジトリを管理する構成です。
GCPの設定
GCP上にGCEを利用してsvnサーバーを立て、3690番ポートを開けます。管理したいファイル容量に応じてboot-disk-size
を変更しましょう。GCSにバックアップ用のバケットを用意します。
gcloud compute addresses create svn-ip \
--region=asia-northeast2
gcloud compute instances create svn-server \
--zone=asia-northeast2-a \
--machine-type=e2-micro \
--boot-disk-size=50GB \
--boot-disk-type=pd-standard \
--image-family=debian-11 \
--image-project=debian-cloud \
--address=svn-ip
gcloud compute firewall-rules create allow-svn-3690 \
--direction=INGRESS \
--priority=1000 \
--network=default \
--action=ALLOW \
--rules=tcp:3690,udp:3690 \
--source-ranges=0.0.0.0/0
gsutil mb -l asia-northeast1 -c ARCHIVE gs://svn-dump-bucket/
SVNサーバーの設定
ここからは、GCEのインスタンス内で実行するコマンドです。svnを初期化しています。また、バックアップ用のスクリプトを作成しています。
sudo apt-get update -y
sudo apt-get install subversion apache2 libapache2-mod-svn -y
sudo mkdir /var/svn
sudo tee /usr/local/bin/svn_dump_to_gcs.sh > /dev/null <<'EOF'
PROJECT_NAME="$1"
SVN_REPO_PATH="/var/svn/$PROJECT_NAME"
GCS_BUCKET_NAME="svn-dump-bucket"
DUMP_FILE="/tmp/${PROJECT_NAME}-$(date +\%Y-\%m-\%d).dump"
svnadmin dump $SVN_REPO_PATH > $DUMP_FILE
gsutil cp $DUMP_FILE gs://$GCS_BUCKET_NAME/
rm $DUMP_FILE
EOF
SVNサーバー起動
SVNサーバーを起動します。
sudo tee /etc/systemd/system/svnserve.service > /dev/null <<EOL
[Unit]
Description=Subversion Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/svnserve -d -r /var/svn
ExecStop=/bin/kill -TERM \$MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOL
sudo chmod +x /usr/local/bin/svn_dump_to_gcs.sh
sudo systemctl daemon-reload
sudo systemctl enable svnserve
sudo systemctl start svnserve
SVNリポジトリ作成
無事SVNサーバーが起動できたはずなので、リモートリポジトリを作りましょう。PROJECT_NAME="your-project-name"
はご自身のプロジェクトネームを設定してください(私はgithubのリポジトリ名に合わせてる)。また、深夜の2時にバックアップが取れるように設定しています。
svnを利用したいプロジェクト毎に、このコマンドを実行すればリモートリポジトリ作成できます。
PROJECT_NAME="your-project-name"
sudo mkdir -p /var/svn/$PROJECT_NAME
sudo svnadmin create /var/svn/$PROJECT_NAME
sudo tee /var/svn/$PROJECT_NAME/conf/passwd > /dev/null <<EOL
[users]
nakanishi1337 = Poku_svn13
EOL
sudo tee /var/svn/$PROJECT_NAME/conf/svnserve.conf > /dev/null <<EOL
[general]
anon-access = none
auth-access = write
password-db = passwd
EOL
crontab -l | {
cat
echo "0 2 * * * /usr/local/bin/svn_dump_to_gcs.sh $PROJECT_NAME"
} | crontab -
sudo systemctl restart svnserve
クライアント側の操作方法
ここからはクライアントの操作方法を説明します。クライアントがlinuxであれば以下のコマンドで、subverionをインストールしてください。
sudo apt-get update
sudo apt-get install subversion
あとはvscodeの拡張機能を使って、gitで言うところのclone, add, commit等ができます。
ただし、subversionが管理するフォルダはassets/の中にあるファイルのみを対象にする設定をして、gitとうまく併用するのがオススメです。
svn add assets
svn propset svn:ignore '*' .
svn propset svn:ignore '' assets
svn commit -m "Set SVN ignore properties"
おわりに
今回はgitとsubversionを併用して、重いファイルをバージョン管理する方法を紹介しました。
Discussion