🙆

subversionの始め方

2024/08/15に公開

はじめに

今回は、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等ができます。
https://marketplace.visualstudio.com/items?itemName=johnstoncode.svn-scm

ただし、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