2011-08-07 7 views
6

無視しておかなければならない古いレポからいくつかのXcodeファイルを削除する必要がありました。だから私は、次のコマンドfilter-branchの--cachedオプションがファイルを作業ディレクトリから削除したのはなぜですか?

git filter-branch --index-filter 'git rm -f --cached --ignore-unmatch *mode1v3 *pbxuser' HEAD 

を走った私の理解では--cachedを追加すると、現在の作業ディレクトリに影響を与えないということでしたが、gitのは、あまりにもそれらの一致するファイルを削除しました。幸運にも私はバックアップを取っていましたが(!)なぜそれがこれをするのか不思議です、または私は何を誤解していますか--cachedは何ですか?

+0

何も関係ありません----- afaik、少なくとも - 引用符を使わないで、--index-filter'でワイルドカード( '*')を使うことはできません。 'git filter-branch 'によってスプールされたシェルはワーキングツリーを使ってワイルドカードを展開します。 –

+0

'-f'なしで試しましたか? – VonC

+0

はい-fなしの同じ結果 – martinjbaker

答えて

4

原因はgit rmコマンドではありません。その--cachedオプションは実際にあなたが言うように機能します。あなたは簡単に小さなgitリポジトリでそれを試すことができます。

マニュアルページには言及していませんが、git filter-branchは作業領域を保存していないようです。実際には、あなたの作業領域が清潔でない場合、コマンドはすでに実行を拒否しています。

ファイルが作業領域から消えても、それらはレポから消えません。彼らは現在あなたの現在のブランチで到達可能なコミットはもうありません。しかし、フィルタブランチストアは参照名空間refs/original /に書き直す前にブランチを参照しています。

コマンドgit show-refを使用して確認してください。

古いバージョンをチェックアウトして、削除したファイルにアクセスすることができます。コマンド git cat-file blob refs/original/refs/heads/master:fooを使用して、チェックアウトせずにファイルの内容を取得することができます(show-refで示される参照を使用し、fooは目的のファイルの名前です)。多くの可能性があります

gitk --allを使用すると、書き換えたものと現在のものの両方をナビゲートすることができ、実際に何もないことがわかります。

1

あなたが発見したように、git-filter-branchの動作は驚くかもしれません。また、実行すると予期しない結果からあなたを守ることはできません。

代わりに、BFG Repo-Cleanerを使用することをお勧めします.Git履歴からファイルを削除するために設計された、よりシンプルで高速な代替手段です。ここであなたの人生を楽にする方法の1つは、それがwill not delete, or change in any wayです。ファイルは最新のコミットです。

あなたはusage instructionsに従うべきである - しかし、コアビットは、ちょうどこのです:BFG's jarをダウンロードする(上記のJava 6以上が必要です)、このコマンドを実行します。

$ java -jar bfg.jar --delete-files *{mode1v3,pbxuser} my-repo.git 

リポジトリの歴史の中でその式にマッチする任意のファイル - それはあなたの中にもありません最新コミット - 削除されます。

  • を削除: - オプションは、これら2つの一般的なユースケースの周りに合わせて調整され

    $ git gc --prune=now --aggressive 
    

    BFGは、一般的にはるかに簡単git-filter-branchよりも使用することです:あなたは、その後死んだデータを離れてきれいにするgit gcを使用することができますパスワード、資格情報 &他プライベートデータを削除するクレイジービッグファイル

私はBFG Repo-Cleanerの著者です。

関連する問題