ソースコード管理をsnapshotからGitBucketに移行した

Posted on 2022年07月18日 in tech

1   概要

ローカルPCで、スナップショットで管理していたソースコードをGitBucketに移行しました。

2   背景

私はプログラムをプログラムするとき、ローカルPCにて試しながらコーディングしています。 そして、ある程度形になったものをcommitしてリモートリポジトリに反映しています。 リモートリポジトリはGitHubやCodebergなどほぼgit管理のものを利用しています。 しかし、ローカルPCではスナップショットバックアップをよく使用していました。 commitした後、きりがよいとき、PC再起動のタイミング [1] などに、

<project_name>-snapshot-YYYYMMDD-HHMM.tar.xz

の形式でディレクトリのスナップショットを取ってバックアップしていました。

変更点を細かく把握できない点など問題があったため、git管理に移行することにしました。

3   移行先

ローカル環境Raspberry Pi 3 model BにてGitBucketが動いており、これを利用しました。

4   移行作業

メインで使用しているPCには20個ほどプロジェクトがあり、手作業で移行は大変でした。 そのため、ある程度自動化しました。

まず、バックアップしている各プロジェクトの最新スナップショットを一ヶ所にまとめました。

# ./<project_name>-snapshots/ 内の最新スナップショットをtoディレクトリに移動
for d in $(find . -type d | grep -E -v "^\.$");
do
        name=$(echo ${d:2} | sed -s "s/-snapshots//g");
        archive=$(ls $d | tail -n1);
        to=/tmp/1/gitbucket-migration/$archive; #移動先
        echo $archive "->" $to;
        sh -c "cd $d; cp $archive $to";
done

その後、まとめた圧縮ファイルを展開しました。 最後に、以下のように各スナップショットをGitBucketにpushしていきました。 GitBucketではGitHub APIを使用可能なため、それを利用してリポジトリ作成をしました。

for d in $(find . -maxdepth 1 -type d | grep -E -v "^\.$");
do
        name=$(sh -c "cd $d; ls"); # 名前
        echo $name;

        # GitBucketのGitHub API v3を利用してリポジトリ作成
        curl\
                -X POST\
                -H "Accept: application/vnd.github+json"\
                -H "Authorization: token <access_token>"\
                --data "{\"name\":\"$name\"}"\ # "name"がリポジトリ名
                http://<gitbucket_url>/api/v3/user/repos;

        # スナップショットの中身をcommitしてpush
        sh -c "\
                cd $d/*;\
                git init;\
                git remote set-url origin http://<git_repo>/$name\.git;\
                git add .;\
                git commit -m \"migrated\";\
                git push origin <branch_name>";
done

以上

6   脚注

[1]/tmp 上で開発する習慣 [2] がありバックアップしないと再起動時に消えてしまう。
[2]HDD・SSD・eMMC等寿命があるストレージの余命を少しでも伸ばすため。 効果は不明。

7   更新履歴

  • 2022-07-18 新規作成
  • 2022-07-18 追記、修正