2012-12-23 17 views
11

gitリポジトリ内のプロジェクトに1つのファイルに間違いがあり、パスワードが含まれています。パブリックリポジトリではないので問題はありませんが、リポジトリでそのパスワードを削除したいと考えています。git内のすべてのコミット内のファイルを編集する

リポジトリ履歴は私が唯一の開発者であるため非常に簡単なので、コミットは12個でコミットの1つにタグが付けられています。

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

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

+1

を私はhttp://stackoverflow.com/questions/1186535/how-to-の重複としてこのフラグを立てあなたがあなたの答えをどこに置いているのかを指定してください。 – zmo

+0

@zmo:あなたが与えたリンクは、この質問とは関係ありません。それは非常によく何かの複製であるかもしれませんが、このものではありません – mvp

答えて

6

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

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

+1

これを拡張するには、 'git filter-branch --tree-filter'を探しています。あなたが望む変更を行うスクリプトに渡すと、gitはすべてのコミットをチェックアウトし、スクリプトを実行し、変更を加えてコミットを再作成します。 – Chronial

2

私が探していたコマンドとフィルタブランチのドキュメントを読んでいただきありがとうございました。ファイルから文字列を削除するためにsedを使用したいと思っていました。

「./path_to_file/filename」削除する必要がある文字列です> - - >が必要レポ内のファイルへのパスです

「パスワード」:

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

変更する

レポルートでrunnedは、魅力のようなトリックでした。

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

ので(ほとんどの場合、原点)リモートサーバへのレポの強制プッシュ

git push origin --all --force 

とタグの強制プッシュ

git push origin --tags --force 
+1

注意:a)強制的にrepoにプッシュし、b)後でrepoのローカルクローンをクリーニングする必要があります。これは私が長い記事にリンクし、ここにすべてを含めることを試みなかった理由です。 – eis

+0

はい、コマンドの後に私は両方のrefsとタグの強制的なプッシュを行いました。私はこの答えを完全に編集するつもりです。ありがとう。 –

0

私は、次の手順を実行します:最初の前で

git rebase --interactive 

変更コマンドpickコミット(コミットパスワードを使用)をeditに設定し、他のすべての行をそのまま使用します。ファイルを保存して終了します。

その後、その後、ファイルからパスワードを削除(およびその他の必要な変更を行います):

git add name-of-file-with-password 
git commit --amend 
git rebase --continue 
関連する問題