1. ホーム
  2. git

[解決済み] Git の履歴から機密性の高いファイルやそのコミットを削除する

2022-03-22 23:39:18

質問

GitプロジェクトをGitHubに掲載したいのですが、機密データ(ユーザー名とパスワード、capistranoの/config/deploy.rbなど)が含まれるファイルがあります。

これらのファイル名を .gitignore しかし、これでは Git 内での履歴を削除することはできません。

また、/.gitディレクトリを削除して、もう一度やり直すのも嫌です。

を削除する方法はありますか? すべて Git の履歴に、ある特定のファイルの痕跡を残すことはできますか?

解決方法は?

実用的には 第一 が気になるところです。 パスワードの変更 あなたのgitリポジトリが完全にローカルなのか、それともまだ他の場所にリモートリポジトリがあるのか、質問からは明らかではありません。もしそれがリモートで、他の人から保護されていないのであれば、問題があります。もしあなたが修正する前に誰かがそのリポジトリをクローンしていたら、彼らはあなたのパスワードのコピーを彼らのローカルマシンに持っていることになり、履歴が消えている状態で彼らにあなたの "fixed" バージョンにアップデートすることを強制することはできません。唯一安全なのは、今まで使っていたパスワードを別のものに変更することです。


それはさておき、修正方法を説明します。 GitHubはFAQとしてまさにその質問に答えています。 :

Windowsユーザーへの注意事項 このコマンドでは、一重引用符の代わりに二重引用符 (") を使用してください。

git filter-branch --index-filter \
'git update-index --remove PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' <introduction-revision-sha1>..HEAD
git push --force --verbose --dry-run
git push --force

2019年のアップデート

FAQに掲載されている現在のコードです。

  git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \
  --prune-empty --tag-name-filter cat -- --all
  git push --force --verbose --dry-run
  git push --force

このコードを GitHub などのリモートリポジトリにプッシュし、他の人がそのリモートリポジトリをクローンすると、今度は自分が歴史を塗り替えてしまうという状況になることを覚えておきましょう。この後、他の人があなたの最新の変更をプルダウンしようとすると、「早送りではないので変更を適用できない」というメッセージが表示されるでしょう。

これを解決するには、既存のリポジトリを削除してクローンを作成し直すか、または、"UPSTREAM REBASEからの復旧 "の説明に従ってください。 git-rebase のマニュアルページ .

チップ : 実行する git rebase --interactive


今後、機密情報を含む変更を誤ってコミットしてしまったが、そのことに気づいたとき 以前 をリモートリポジトリにプッシュする場合、いくつかの簡単な修正方法があります。もし最後のコミットが機密情報を追加するものであれば、単に機密情報を削除してから実行すればいいのです。

git commit -a --amend

これは、あなたが行った新しい変更で前のコミットを修正するもので、その中には git rm . もし、変更点がさらに過去のもので、まだリモートリポジトリにプッシュされていない場合は、対話的なリベースを行うことができます。

git rebase -i origin/master

リモートリポジトリとの最後の共通の祖先から行ったコミットについてのエディターが開きます。機密情報を含むコミットを表す行で "pick" を "edit" に変更し、保存して終了します。Git が変更点を洗い出し、変更可能な場所にあなたを置いていきます。

$EDITOR file-to-fix
git commit -a --amend
git rebase --continue

機密情報を含む変更ごとに。最終的には自分のブランチに戻ってくるので、新しい変更を安全にプッシュすることができます。