研究データや機密プロジェクトなど、外部サービスにアップロードできないコードを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と同じ操作感: originmainといった標準的な名前で、通常のGitワークフローをそのまま使える

研究データや企業の機密プロジェクトなど、外部に出せないコードのバージョン管理に最適です。通常のGitワークフローと変わらない操作感で、安全にコードを管理できます。