1. はじめに
以前の記事でメディアフォルダのワークスペース化もやってみましたが、フォルダごとにリポジトリ運用するのはちょっと手間だなと思ってました。.gitignore の除外指定でうまいことできないかと思ったら…あるじゃないですか!便利な書き方が!!
/*
!/DCIM/
!/Movies/
これで、特定のフォルダだけを管理対象として、SDカードのルートディレクトリをGit管理下に置くことができます。今回は、メディアフォルダをまるごとGit管理する方向で、Gitの導入手順を再構成してみます。
なお、本記事の手順は Linux Mint 22.2 Cinnamon Edition での作業をベースにしています。
Windowsでの作業にも対応しています。
以前の記事はこちらです。
2. なぜスマホ?なぜGit?
以前から、FreeFileSyncを使用してPCとスマホのデータを同期していました。オフサイトバックアップに近いことをやりたかったので。SVN運用も検討しましたが、多数のファイルをまとめてコミットしたらすごい時間がかかる。サーバ復旧時はこれをもう一回やるのかー、と考えたあたりでGit運用に決定しました。各クライアントにリポジトリのコピーがあることのメリットがここに。定期バックアップとかの手間は省きたいのです。
3. PCのセットアップ
3.1 ソフトウェアのインストール
本記事ではRabbitVCSを使用してGit操作を行います。Linux Mintのソフトウェアマネージャから、以下をインストールしてください。
- Git
- Subversion1
- Rabbitvcs-core
- Nemo-python
RabbitVCSの右クリックメニュー統合には RabbitVCS.py が必要です。以下のサイトからダウンロードし、~/.local/share/nemo-python/extensions に配置してお使いください。次のコマンドでも対応できます。
mkdir -p ~/.local/share/nemo-python/extensions && \
wget -O ~/.local/share/nemo-python/extensions/RabbitVCS.py \
https://raw.githubusercontent.com/rabbitvcs/rabbitvcs/master/clients/nemo/RabbitVCS.py
RabbitVCS.py の配置後すぐは、右クリックメニューに反映されていません。一度ログアウトしてからログインしなおすと、使えるようになります。
Windows環境では以下をインストールしてご使用ください。
- Git for Windows
- TortoiseGit
3.2 SSH鍵の作成
ターミナルで以下のコマンドを実行して、SSH認証用の鍵ペアを作成します。作成先フォルダとファイル名はデフォルトでかまいません。パスフレーズも空で良いでしょう。~/.ssh に秘密鍵 id_ed25519 と公開鍵 id_ed25519.pub が作成されます。サーバ側で管理しやすいように、公開鍵末尾にコンピュータ名を付与しています。
ssh-keygen -t ed25519 -C "$(hostname)"
Windowsも同じコマンドで作成します。作成先は C:\Users\ユーザ名\.ssh です。
4. スマホのセットアップ
4.1 Termuxのインストール
以下のサイトを開いてスクロールしていくと、F-Droidクラインアントのインストールがお勧めされています。なので、まずはF-Droidをインストールします。「F-DROIDをダウンロード」ボタンをタップし、F-Droid.apk をダウンロードしてインストールしてださい。スマホから警告が出ますが、適宜対応くださいw
インストールできたら、F-Droidを開いて「Termux」を検索します。何やらいっぱい出てきますが、説明に以下の文言があるものを選んでインストールします。Termuxはサーバ運用するので、インストール後はバッテリの最適化をオフにすると良いでしょう。
- パッケージを伴ったターミナル・エミュレーター
4.2 SSH接続の準備
本記事ではSSH経由でGitサーバに接続します。Termuxを開いて以下のコマンドを実行してください。パッケージ情報を更新し、インストール済みパッケージをバージョンアップしてからOpenSSHをインストールします。コマンド実行時に確認のプロンプトが出ますが、すべてデフォルト動作で問題ないのでEnterキー(⏎)をタップしてください。
pkg update
pkg upgrade
pkg install openssh
鍵認証を設定するまではパスワードで認証する必要があります。以下のコマンドでパスワードを設定してください。入力中のパスワードは表示されません。
passwd
SSHの接続先は u0axxx@192.168.x.x 形式で指定します。ユーザ名とIPアドレスを以下のコマンドで確認してください。
whoami
ifconfig
以下のコマンドでSSHデーモンを起動します。これでPCからスマホにSSH接続できるようになります。
sshd
4.3 SSH鍵認証の設定
ここからは、PCからスマホに接続して作業します。以下のコマンドで接続してください。初回接続時は、未知の接続先として警告が出ますので yes と入力してください。
ssh u0axxx@192.168.x.x -p 8022
PCからSShで接続できたら、TermuxにSSH鍵認証を設定します。以下のコマンドで authorized_keys ファイルを開いてください。PCで作成した id_ed25519.pub をテキストエディタで開いて、中身の文字列をまるっと authorized_keys にコピペで追加します。追加したら「Ctrl + O」からの「Enter」で保存し、「Ctrl + X」で終了します。
nano ~/.ssh/authorized_keys
追加後は、PC側のSSHクライアント設定ファイルを準備します。config ファイルを作成して、以下のように記載してください。
Host termux-ssh
HostName 192.168.x.x
User u0axxx
Port 8022
IdentityFile ~/.ssh/id_ed25519
Windowsも同じ記載で機能します。作成先は C:\Users\ユーザ名\.ssh です。
これで、以降は以下のコマンドで接続できるようになります。パスワードは不要です。
ssh termux-ssh
4.4 SSHデーモンの起動設定
今回は常時起動ではなく、使用したいときだけ起動する運用方法とします。.bashrc と .bash_logout を以下のように作成してください。これでTermuxの起動時と終了時に、SSHデーモンも起動と終了することができます。Termux終了時は、exit コマンドまたは「Ctrl + D」で終了してください。
nano ~/.bashrc
if [[ ! $SSH_CONNECTION ]]; then
termux-wake-lock
sshd
fi
nano ~/.bash_logout
if [[ ! $SSH_CONNECTION ]]; then
pkill sshd
termux-wake-unlock
fi
4.5 シェルプロンプトの改変
Termuxのシェルプロンプトって、何か殺風景な感じがしませんか?Linux Mintのそれとは温度差があるというかなんというか。
そこで .bashrc に以下のように追記します。
if [[ ! $SSH_CONNECTION ]]; then
termux-wake-lock
sshd
+ else
+ PS1="\[\033[1;34m\]termux@Redmi-12-5G\[\033[0m\]:$PS1"
fi
すると、こうなります。殺風景さが気なる方はどうぞ。
5. Gitサーバのセットアップ
5.1 Gitのインストール
さて、ここからスマホをGitサーバとしてセットアップしていきます。今回はSSH経由でGitサーバに接続するので、「Git」だけあればOKです。以下のコマンドでインストールします。
pkg install git
Gitのインストールが完了したら、以下のコマンドでいくつかの項目を設定します。デフォルトブランチは何も設定しないと master になるため、一般的に使用されている main に変更します。コミット履歴には、どのデバイスからのコミットなのかを残したいので「user.name」にデバイス名(Redmi-12-5G など)を設定します。私的運用を前提にしているので、メールアドレスにはダミーを設定しています。
git config --global init.defaultBranch main
git config --global user.name "デバイス名"
git config --global user.email user@example.com
PC側も同様の設定をしておいてください。
git config --global init.defaultBranch main
git config --global user.name "$(hostname)"
git config --global user.email user@example.com
5.2 リポジトリフォルダの作成
今回はスマホのSDカード上にリポジトリを作成して運用します。以下のコマンドを実行して、SDカードにアクセスできるようにします。内部ストレージの共有フォルダにもアクセスできるようになります。
termux-setup-storage
コマンドを実行すると、~/storage 配下に以下のシンボリックリンクが作成されます。各リンク先フォルダのアクセス権も適宜設定されています。
| シンボリックリンク | リンク先 |
|---|---|
| external-1 | /storage/xxxx-xxxx/Android/data/com.termux/files |
| shared | /storage/emulated/0 |
| dcim | /storage/emulated/0/DCIM |
| downloads | /storage/emulated/0/Download |
| movies | /storage/emulated/0/Movies |
| music | /storage/emulated/0/Music |
| pictures | /storage/emulated/0/Pictures |
シンボリックリンクが作成されたことを確認したら、SDカードのルートディレクトリをリンク先とするシンボリックリンクを作成します。まずは、SDカードのマウントポイントを確認します。/storage/xxxx-xxxx の部分です。以下のコマンドで確認します。
ls -l ~/storage/external-1
マウントポイントが確認できたら、以下のコマンドでHOMEディレクトリ直下にシンボリックリンクを作成します。
ln -s /storage/xxxx-xxxx ~/sdcard
続いて、sdcard の配下にGitリポジトリ用のフォルダを作成し、HOMEディレクトリ直下にシンボリックリンクを作成します。
mkdir -p ~/sdcard/.termux/git && \
ln -s ~/sdcard/.termux/git ~/git
SDカードを使用しない場合は、~/git フォルダを作成してください。
mkdir ~/git
5.3 Gitリポジトリの作成
それでは、Gitリポジトリを作成します。リポジトリ名は my-first-repo とすることにします。以下のコマンドを実行してください。SDカード上のフォルダはTermuxのフォルダと所有者が違うので、「safe.directory」の設定が必要です。
mkdir ~/git/my-first-repo && \
cd ~/git/my-first-repo && \
git init --bare && \
git config --global --add safe.directory "$(pwd)"
リポジトリが作成できたら、PC側でクローンしてみましょう。Git作業用のフォルダ(~/GIT など)で右クリックして、「RabbitVCS Git」から「Clone」を選択します。「URL」欄に以下をコピペしてOKボタンをクリックすると、リポジトリがクローンされます。「コミット」や「プッシュ」は、my-first-repo フォルダ内から右クリックで行うことができます。
ssh://termux-ssh/~/git/my-first-repo
6. メディアフォルダのワークスペース化
6.1 リモートリポジトリとの紐付け
ここでは、スマホのメディアフォルダをGit運用できるようにします。今回はSDカードのルートディレクトリをGit管理化に置いて、コミット対象を .gitignore で指定します。まずは、以下のコマンドでSDカード用のリポジトリを作成します。
mkdir ~/git/sdcard && \
cd ~/git/sdcard && \
git init --bare && \
git config --global --add safe.directory "$(pwd)"
続いて、SDカードのルートディレクトリをGitのワークスペースにします。以下のコマンドでローカルリポジトリを作成し、先ほど作成したリポジトリと紐付けます。
cd ~/sdcard && \
git init && \
git remote add origin ~/git/sdcard && \
git config --global --add safe.directory "$(pwd)"
SDカードを使用しない場合は、以下のように読み替えてください。
| 本文の記載 | 読み替え |
|---|---|
・ ~/git/sdcard・ ~/sdcard
|
・ ~/git/shared・ ~/storage/shared
|
6.2 初回コミットの実施
それでは、SDカードのメディアフォルダにあるファイルをまとめてコミットします。まずは、管理対象とするフォルダの設定です。以下のコマンドで .gitignore ファイルを作成して編集します。管理対象フォルダは、各自の必要に応じて設定ください。
nano .gitignore
/*
!/.gitignore
!/Alarms/
!/DCIM/
!/Movies/
!/Notifications/
!/Recordings/
!/Ringtones/
.tmfs/
.thumbnails/
編集が終わったら、以下のコマンドですべてを追加してコミット&プッシュします。
git add -A && \
git commit -m "Initial commit" && \
git push -u origin main
6.3 自動コミットの設定
写真を撮影した場合など、メディアフォルダにファイルが増えたらコミット&プッシュの操作が必要になります。手動でやるのも面倒なので、.bashrc に仕込んでしまいましょう。
nano ~/.bashrc
if [[ ! $SSH_CONNECTION ]]; then
termux-wake-lock
sshd
+ cd ~/sdcard && \
+ pwd && \
+ git pull && \
+ git add -A && \
+ git commit -m "Auto commit" && \
+ git push
+ cd ~
else
PS1="\[\033[1;34m\]termux@Redmi-12-5G\[\033[0m\]:$PS1"
fi
7. モバイルサーバの復旧手順
7.1 リモートリポジトリの復旧
-
空のベアリポジトリ作成
「5.3 Gitリポジトリの作成」のリポジトリ作成までを実施。 -
クライアントのクローンからプッシュ
右クリックのメニューから「Push」を選択して実行。
複数ブランチを運用していた場合は、以下のコマンドを実行ください。
git push origin --all --tags
7.2 メディアフォルダの復旧
-
ローカルリポジトリ作成と紐付け
「6.1 モートリポジトリとの紐付け」までを実施。 -
リモートリポジトリからプル
ワークスペース内で以下のコマンドを実行。
git branch --set-upstream-to=origin/main main && \
git pull
-
RabbitVCSはGit&SVN両対応なので、ついでに入れますw ↩




