2011-11-01 10 views
5

残念ながら、私たちは偶然、ある時間前に大きなバイナリファイルをチェックインしました。今私はそのコミットを落とし、残りの歴史をそのまま残したいと思います。私は押された歴史の変化の警告について知っているが、この場合、私はそれを避けることはできない。古いコミットを取り除く: `git rebase`はマージの競合を引き起こします

私は約1時間は達成しようとしていますが、それを得ることはできません。私が見つけた最高のコマンドは、

git rebase --interactive --preserve-merges $(EVIL_COMMIT)^ 

であり、編集者は悪い1番目のコミットをコメントアウトしています。

残念ながら、git rebaseは、マージ時に停止し、マージ競合の手動解決を求めます。悪意のあるコミットは、私たちのソフトウェアがテスト目的のために計算するいくつかのサンプルファイルを追加するだけです。したがって、ちょうど欠けているサンプルファイルとの衝突はあってはいけません。

  1. マージの競合の原因はわかりません。誰かが説明できますか?
  2. 解決方法

私はGoogleとSOの検索にかなりの時間を費やしました。いくつかのスレッドは同様のトピックをカバーしていますが、今日のGitバージョンではsyntax used is not availableのいずれか、またはそれは私のためには機能しませんでした(私は上記の方法のほうが簡単でした。

+0

が重複する可能性をチェックし、gitの履歴からファイルをパージするための便利なスクリプトを開始しましたgitリポジトリの履歴?](http://stackoverflow.com/questions/2100907/how-to-remove-delete-a-large-file-from-commit-history-in-git-repository) –

答えて

6

私はfilter-branchでいいと思う:

git filter-branch --prune-empty --index-filter ' 
    git rm --cached --ignore-unmatch path/to/file 
' --all 
+0

これはのみを削除しますファイル 'path/to/file'をすべてのリビジョンから削除しますか?私が理解する限り、バイナリを削除した後に空になるコミットは削除されません(実際には4つあります)。 –

+2

フィルタブランチコマンドに '--prune-empty'を追加してください。 –

+1

この答えでは、 '$(EVIL_COMMIT)^'ではなく 'HEAD'を意味すると思います。そうでなければ、大きなファイルを導入した前のものにコミットするだけです。 –

関連する問題