研究データや機密プロジェクトなど、外部サービスにアップロードできないコードをGitで管理したい場合、ローカルにbareリポジトリを作成してバックアップする方法が便利です。この記事では、GitHubと同じような感覚で使えるローカルバックアップの構築方法を解説します。
bareリポジトリとは
bareリポジトリは作業ディレクトリを持たない、純粋なGitデータベースです。.gitディレクトリの内容だけで構成されており、中央リポジトリとして機能します。GitHubのリモートリポジトリと同じ役割を、ローカル環境で果たします。
方法1:新規プロジェクトの場合
1. バックアップ用bareリポジトリの作成
# バックアップ先ディレクトリで(外部ドライブなど)
git init --bare /path/to/backup/myproject.git
2. 作業リポジトリの初期化とプッシュ
# 作業ディレクトリで
cd /path/to/working/myproject
git init
git remote add origin /path/to/backup/myproject.git
# 初回コミット
git add .
git commit -m "Initial commit"
git branch -M main
git push -u origin main
-
commit: ステージングエリアの変更を履歴として記録-m: コミットメッセージをコマンドラインで直接指定-mを省略するとエディタが起動する"Initial commit": コミットメッセージ本文
-
branch: ブランチを操作するコマンド-M: 現在のブランチ名を強制的に変更(Move/rename)- 大文字の
Mは強制変更(既に同名ブランチがあっても上書き) - 小文字の
-mは安全な変更(同名ブランチがあるとエラー) main: 新しいブランチ名
補足:従来はmasterが標準だったが、現在はmainが推奨
push: ローカルの変更をリモートリポジトリに送信-u:--set-upstreamの省略形。上流ブランチを設定- 以降は
git pushだけでこのリモート・ブランチにプッシュされる git pullも同様に設定される
- 以降は
origin: リモートリポジトリの名前(通常はデフォルト名)main: プッシュするローカルブランチ名
方法2:既存のbareリポジトリからcloneする場合
既にbareリポジトリがある場合は、通常のcloneと同じ操作です。
# bareリポジトリから作業リポジトリを作成
git clone /path/to/backup/myproject.git /path/to/working/myproject
# ディレクトリ名を指定しない場合は現在のディレクトリに作成
cd /path/to/working
git clone /path/to/backup/myproject.git
cloneすると自動的にoriginリモートが設定されます:
cd myproject
git remote -v
# origin /path/to/backup/myproject.git (fetch)
# origin /path/to/backup/myproject.git (push)
cloneしたときのブランチの状態
デフォルトブランチのみチェックアウトされる
git clone /path/to/backup/myproject.git
cd myproject
git branch
# * main (デフォルトブランチのみ表示)
すべてのブランチは取得済み
リモートブランチとしてすべて取得されています:
# リモートブランチを含めて表示
git branch -a
# * main
# remotes/origin/HEAD -> origin/main
# remotes/origin/main
# remotes/origin/develop
# remotes/origin/feature/analysis
他のブランチを使う方法
リモートブランチから自動的にローカルブランチを作成:
# シンプルなcheckout(推奨)
git checkout develop
# Branch 'develop' set up to track remote branch 'develop' from 'origin'.
# 確認
git branch
# main
# * develop
すべてのブランチをローカルに作成したい場合
# すべてのリモートブランチをローカルに作成
for branch in $(git branch -r | grep -v '\->'); do
git checkout --track $branch
done
# または個別に
git checkout develop
git checkout feature/analysis
git checkout main # 元に戻る
clone時に特定のブランチを指定
# 特定のブランチのみをclone
git clone -b develop /path/to/backup/myproject.git
# 確認
git branch
# * develop
方法3:既存プロジェクトにローカルバックアップを追加
GitHubなど既存リモートがある場合
cd /path/to/existing/project
# 既存のoriginを別名に変更
git remote rename origin github
# ローカルバックアップをoriginとして追加
git remote add origin /path/to/backup/myproject.git
# 初回プッシュ
git push -u origin main
リモートを複数管理する場合
# ローカルバックアップ
git remote add origin /path/to/backup/myproject.git
# 外部リモート(GitHub等)
git remote add github https://github.com/user/repo.git
# それぞれにプッシュ
git push origin main
git push github main
日常的な使い方
設定後は通常のGitワークフローと全く同じです。
# 変更をコミット
git add .
git commit -m "Update analysis script"
# バックアップにプッシュ
git push
# 最新版を取得
git pull
# ブランチ作成
git checkout -b feature/new-analysis
git push -u origin feature/new-analysis
# すべてのブランチとタグをバックアップ
git push origin --all --tags
リストア・復元方法
バックアップから新しい作業環境を作成
# 別の場所にclone
git clone /path/to/backup/myproject.git /path/to/restore/myproject
特定のブランチやコミットを復元
cd /path/to/restore/myproject
# 特定のブランチをチェックアウト
git checkout develop
# 特定のコミットを確認
git log
git checkout <commit-hash>
便利なTips
外部ドライブをバックアップ先にする
# USBドライブやNASに作成
git init --bare /Volumes/BackupDrive/repos/myproject.git
git remote add origin /Volumes/BackupDrive/repos/myproject.git
複数リモートに同時プッシュ
.git/configに以下を追加:
[remote "all"]
url = /path/to/backup/myproject.git
url = https://github.com/user/repo.git
使用例:
git push all main # 両方のリモートに同時プッシュ
エイリアスで簡略化
~/.gitconfigに追加:
[alias]
backup = push origin --all --tags
sync = !git pull && git push
使用例:
git backup # すべてをバックアップ
git sync # プルしてプッシュ
ブランチの挙動まとめ
| 操作 | ローカルブランチ | リモートブランチ |
|------|----------------|----------------|
| git clone | デフォルトのみ作成 | すべて取得済み |
| git checkout <branch> | 自動作成・追跡設定 | 既に存在 |
| git branch | ローカルのみ表示 | - |
| git branch -a | ローカルも表示 | すべて表示 |
| git push | 現在のブランチのみ | 対応するブランチに |
| git push --all | すべてのローカル | すべて更新 |
重要: cloneしただけではデフォルトブランチしかローカルに作成されませんが、git checkout <branch名>で簡単に他のブランチも使えるようになります。
まとめ
ローカルbareリポジトリを使うことで、以下のメリットがあります:
- セキュリティ: 機密データを外部サービスにアップロードせずに済む
- 高速: ネットワークを介さないため、プッシュ・プルが高速
- オフライン: インターネット接続不要
- 完全な制御: バックアップの場所やタイミングを自由に管理
- GitHubと同じ操作感:
originやmainといった標準的な名前で、通常のGitワークフローをそのまま使える
研究データや企業の機密プロジェクトなど、外部に出せないコードのバージョン管理に最適です。通常のGitワークフローと変わらない操作感で、安全にコードを管理できます。