14

間違えて、git リポジトリ内のプロジェクトの 1 つのファイルにパスワードが含まれています。公開レポではないので問題ありませんが、レポでそのパスワードを削除したいと思います。

私は唯一の開発者であるため、リポジトリの履歴は非常に単純です。12 件のコミットしかなく、そのうちの 1 件にタグが付けられています。

この場合の変更は、最初のコミットから削除したいパスワードが存在するため、履歴には何も影響しません (差分は同じままです)。いつでもそこになかったかのように、その文字列を削除したいと思います。

これを行うための何らかのコマンドはありますか、それとも、パスワードを使用せずに新しい開始点で最初から履歴を再生成し、その上に差分を適用する必要がありますか?

4

3 に答える 3

8

https://help.github.com/articles/remove-sensitive-dataを参照してください。すべてのコミットにはリポジトリ全体の状態が含まれているため、ファイルを削除していない場合、ファイルはすべてのコミットに存在します。

基本的に、必要なことは、すべてのコミットに対してフィルター ブランチを実行し、それをレポに強制的にプッシュすることです。このコマンドは破壊的であり、ファイルがリポジトリに存在していたすべてのコミットを変更するため、注意してください。

于 2012-12-23T16:20:44.387 に答える
4

それはまさに私が探していたコマンドであり、その記事とフィルターブランチのドキュメントを読んで、sedを使用してファイルから文字列を削除したい正確な構文を取得しました。

git filter-branch --tree-filter "sed -i 's/\<password\>//g' ./path_to_file/filename" --prune-empty --tag-name-filter cat -- --all

どこ:

"password" -> 削除する必要がある文字列です

"./path_to_file/filename" -> 変更が必要なリポジトリ内のファイルへのパスです

レポルートで実行すると、魔法のようなトリックが行われました。

変更を行った後、リモート サーバーにプッシュする必要があります。サーバーがまったく新しい書き換えられた参照とタグを受け入れるように、これを強制する必要があります。

したがって、レポをリモートサーバーに強制的にプッシュします(ほとんどの場合、オリジン)

git push origin --all --force

そして、リモートサーバーへのタグの強制プッシュ

git push origin --tags --force
于 2012-12-24T11:36:10.740 に答える
2

私は次のことをします:

git rebase --interactive

pick最初のコミット (パスワード付きのコミット) の前にあるコマンドを変更し、edit他のすべての行をそのままにします。ファイルを保存して終了します。

次に、ファイルからパスワードを削除し (その他の必要な変更を行います)、次のようにします。

git add name-of-file-with-password
git commit --amend
git rebase --continue
于 2012-12-24T19:50:38.873 に答える