はじめに
今回、ローカル環境では正常に動作しているにも関わらず、GitHubのリモートリポジトリに不要なファイルや別プロジェクトの履歴が混入してしまうという問題に遭遇し、最終的に解決に至った経緯を記録します。
普段、AAAリポジトリ[私のprivateリポジトリ(仮称)]ではGitHub Desktopを使用していましたが、他のプロジェクトでCLI(Git)を頻繁に使うようになり、「CLI操作の方が効率的だろう」と考えてコマンドラインからpushを実行したところ、予期せぬ問題が発生しました。
試行錯誤の過程
今回のケースは、単なる「不要ファイル混入」ではなく、
同名フォルダが別プロジェクト由来の内容と混在し、ディレクトリ構造そのものが崩れている状態でした。
そのため、ローカルで不要ファイルを削除しても、pushのたびに過去履歴から混在ファイルが復活してしまいます。
そこで、以下の方法を試しました。
-
git remote removeによる不要なリモート削除 → 効果なし -
git push --forceによる強制上書き → 不要ファイルが残存 -
git rm --cachedによる追跡解除 → 解除されず - orphanブランチ作成後のpush → 過去履歴から不要ファイルが再出現
いずれの方法も、ローカル環境は正常であるにも関わらず、push後のリモートリポジトリは問題のある状態が継続しました。
問題の詳細
CLIでcommit・pushを実行後、GitHubリポジトリを確認すると、ローカルリポジトリとは異なる内容が表示されていました。特に、同名のディレクトリ内でファイルが混在している状況でした。
git remote -v で確認したところ、ローカルの AAA ディレクトリで以下の状態が判明しました:
origen https://github.com/yamadataiyou/Qiita-content (fetch)
origen https://github.com/yamadataiyou/Qiita-content (push)
origin https://github.com/yamadataiyou/AAA111.git (fetch)
origin https://github.com/yamadataiyou/AAA111.git (push)
問題点:
-
originとorigen(入力ミス)により、異なるGitHubリポジトリが同一環境に設定されていた - 過去の別プロジェクト(
AAA111)の履歴とファイルが現在のリポジトリに混入 - GitHub Desktop使用時には表面化しなかったが、CLI操作により不要ファイルが大量に出現
解決方法
根本原因は.gitディレクトリ内に残存していた過去の履歴および接続情報でした。
この問題を解決するため、.gitディレクトリを完全に削除し、ローカルの現在の状態のみで再初期化を実行しました。
実行手順
rm -rf .git
git init
git remote add origin https://github.com/yamadataiyou/AAA.git
git add .
git commit -m "Initial clean commit"
git branch -M main
git push origin main --force
解決の仕組み
-
.gitディレクトリには過去の異なるプロジェクトの履歴と不要ファイルの情報が保存されていた - push実行時、これらの履歴も同時に送信され、不要ファイルが復活していた
-
.git削除により過去の履歴を完全に排除し、ローカルの作業ツリーのみで新しい履歴を構築 -
--forcepushによりリモートを完全に上書きし、不要ファイルを除去
今後の対策
- 既存プロジェクトのディレクトリを流用する際は、
.gitディレクトリを必ず削除してからgit initを実行 -
git remote -vによる接続先の定期的な確認 - GitHub DesktopとCLIでは内部状態の処理方法が異なるため、ツール切り替え時は特に注意
- ローカル環境が正常でもリモートに問題がある場合、履歴の完全なリセットも選択肢として検討
まとめ
今回の事例は、ローカル環境では正常に動作しているにも関わらず、リモートリポジトリに不要な履歴やファイルが混入するという、診断が困難なトラブルでした。
同様の症状として、
- 削除したファイルが何度でも復活する
-
.gitignoreや--forcepushが機能しない
といった現象が発生している場合、.gitディレクトリの削除と再初期化による解決が有効です。また、リモート設定にタイポ(origin と origen など)が混ざると予期せぬ挙動につながるため、git remote -v で定期的に確認すると安心です。
なお、GitHub Desktopは便利ですが、CLIと比べると表示更新にワンテンポ遅延があると感じました。今回の件をきっかけに、今後はCLI操作を中心に作業を進めていく予定です。