状況の説明
git clone を実行してEnterを押した瞬間、こんなエラーに直面することがあります:
fatal: destination path 'project-name' already exists and is not an empty directory.
以前にこのリポジトリをクローンしたことを忘れていたのかもしれません。あるいは前回のクローンが途中で失敗したか、チームメンバーがすでにそのフォルダに何かを置いていたのかもしれません。いずれにせよ、Gitは既存のディレクトリを上書きしようとせず、作業を今すぐ進めたい状況で手が止まってしまいます。
エラーが発生する原因
Gitは、すでに存在しファイルが含まれているディレクトリにはクローンできません。これは意図的な仕様で、大切な作業を上書きから守るための保護機能です。そのディレクトリには以下のようなものが含まれている可能性があります:
- 同じリポジトリの以前の(おそらく不完全な)クローン
- 途中まで展開されたアーカイブやスキャフォールド
- 誤ってそこに置かれた無関係なファイル
- まったく別のGitリポジトリ
対処方法はケースによって異なるため、何かを実行する前にどの状況に該当するかを確認してください。
ステップ1 — 既存の内容を確認する
# 中身を確認する
ls -la project-name/
# すでにGitリポジトリかどうかを確認する
ls -la project-name/.git/
.git/ フォルダが存在する場合、すでにクローンがある状態です(完全・壊れている・古いのいずれか)。.git/ がなければ、単なる普通のディレクトリが邪魔をしているだけです。
対処法A — 削除して再クローン(最もシンプル)
そのフォルダに保持すべきものが何もない場合は、削除してやり直しましょう:
# Linux / macOS
rm -rf project-name/
git clone https://github.com/org/project-name.git
# Windows PowerShell
Remove-Item -Recurse -Force project-name
git clone https://github.com/org/project-name.git
# Windows CMD
rd /s /q project-name
git clone https://github.com/org/project-name.git
正常に完了したか確認します:
cd project-name
git status
# 表示例: On branch main, nothing to commit
対処法B — 別のディレクトリにクローンする
既存のフォルダを削除したくない場合は、別のターゲット名を指定してGitにクローンさせましょう:
git clone https://github.com/org/project-name.git project-name-fresh
バージョン付きのコピーを並べて作成することもできます:
mkdir project-name-v2 && git clone https://github.com/org/project-name.git project-name-v2
これはリスクゼロの方法で、削除も上書きも一切発生しません。
対処法C — すでにクローン済みのディレクトリ(フェッチ+リセット)
.git/ フォルダがある場合、そのディレクトリはすでにGitリポジトリです。削除せずに、更新するだけで済みます:
cd project-name
# 正しいリモートを指しているか確認する
git remote -v
# 最新の変更を取得する
git fetch --all
git reset --hard origin/main
# リモートと完全に一致するクリーンな状態にする場合
git fetch origin
git checkout main
git reset --hard origin/main
git clean -fd
注意点として、git clean -fd は追跡されていないファイルとディレクトリを完全に削除します。このコマンドを実行する前に、保存していない内容がないかしっかり確認してください。
対処法D — .gitがない場合の初期化とプル
フォルダにソースファイルはあるがGit履歴がない場合は、クローンをスキップして、その場でリポジトリを初期化してリモートからプルする方法があります:
cd project-name
git init
git remote add origin https://github.com/org/project-name.git
git fetch origin
git reset --hard origin/main
既存のファイルはそのままにしつつ、Gitが全履歴をダウンロードします。ただし、git reset --hard はローカルの変更をリモートブランチの内容で上書きするため、保持したいものは事前に保存しておいてください。
恒久的な対策 — ワークスペースディレクトリを使う
このエラーはCI/CDシステムや複数リポジトリを扱う開発マシンで特に頻発します。最も簡単な予防策は、常に専用のワークスペースフォルダ配下にクローンする習慣をつけることです。
# こうではなく:
git clone https://github.com/org/project-name.git
# こうする:
mkdir -p ~/workspace
cd ~/workspace
git clone https://github.com/org/project-name.git
CI/CDでは、クローンの前にクリーンアップステップを追加しましょう:
# GitHub Actions の例
- name: Clean workspace
run: rm -rf ${{ github.workspace }}/project-name
- name: Clone repo
run: git clone $REPO_URL
さらにシンプルな方法として、組み込みの actions/checkout アクションを使う方法があります。古いディレクトリを自動的に処理してくれます。
Jenkinsの場合は、SCM設定で Wipe out repository & force clone を有効にするか、シェルステップを追加してください:
rm -rf ${WORKSPACE}/project-name || true
git clone ${REPO_URL} project-name
修正の確認
cd project-name
# 有効なリポジトリであることを確認する
git status
# リモートが正しいことを確認する
git remote -v
# 直近のコミットが正しく反映されているか確認する
git log --oneline -5
正常なクローンはこのように表示されます:
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
この出力が表示されれば完了です。git status に追跡されていないファイルや予期しない変更がある場合は、コミットする前に調査してください — 何かが残っている可能性があります。
判断チートシート
- ディレクトリに重要なものがない → 削除して再クローン
- 同じリモートを指すGitリポジトリがすでにある → フェッチ+リセット
- 既存のファイルを保持したい → 別のフォルダにクローン
- ソースファイルはあるが .git/ がない → git init+リモート追加+フェッチ+リセット
- CIで繰り返し発生する → クローン前にクリーンアップステップを追加

