[解決済み] Git の履歴から機密性の高いファイルやそのコミットを削除する
質問
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
機密情報を含む変更ごとに。最終的には自分のブランチに戻ってくるので、新しい変更を安全にプッシュすることができます。
関連
-
[解決済み] Gitのプッシュエラーです。Unable to unlink old (Permission denied)です。
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Gitを使って最後のXコミットをまとめる
-
[解決済み] Git でブランチからコミットを削除する
-
[解決済み] Git のローカルコミットを破棄する
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】Gitで複数のコミットの著者名やコミッター名、Eメールを変更する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Git:コミットに何も追加されていないが、未追跡のファイルが存在する
-
[解決済み】マージの競合が発生した git stash pop の取り消し
-
Gitのプッシュでエラーが発生! [リモート拒否] master -> master (pre-receive hook declined) error: failed to push s...
-
[解決済み] リモートから<branch name>とマージするように構成が指定されていますが、そのような参照は取得されませんでしたか?
-
[解決済み] "would clobber existing tag "を取り除くには?
-
[解決済み] fatal: EOF が早い fatal: インデックスパックが失敗した
-
[解決済み] Git pull - マージする前に移動または削除してください。
-
[解決済み] git status に fatal: bad object HEAD と表示される。
-
[解決済み] git commit signing failed: secret key not available.
-
[解決済み] "fatal: This operation must be run in work tree." というメッセージが表示されるのはなぜですか?