バイナリの膨張を取り除き、残りの履歴を保持することができます。Gitを使用すると、以前のコミットを並べ替えて「押しつぶす」ことができるため、大きなバイナリファイルを追加および削除するコミットのみを組み合わせることができます。追加がすべて1つのコミットで行われ、削除が別のコミットで行われた場合、これは各ファイルを処理するよりもはるかに簡単です。
$ git log --stat # list all commits and commit messages
これを検索して、バイナリファイルを追加および削除するコミットを検索し、それらのSHA1、say2bcdef
および3cdef3
。
次に、リポジトリの履歴を編集するにはrebase -i
、バイナリを追加したコミットの親から始めて、インタラクティブオプションを指定してコマンドを使用します。$ EDITORが起動し、2bcdef
次で始まるコミットのリストが表示されます。
$ git rebase -i 2bcdef^ # generate a pick list of all commits starting with 2bcdef
# Rebasing zzzzzz onto yyyyyyy
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
pick 2bcdef Add binary files and other edits
pick xxxxxx Another change
.
.
pick 3cdef3 Remove binary files; link to them as external resources
.
.
squash 3cdef3
2行目として挿入 pick 3cdef3
し、リストからその行を削除します。rebase
これで、バイナリを追加および削除するコミットを1つのコミットに結合する、インタラクティブのアクションのリストができました。その差分は、それらのコミットの他の変更にすぎません。次に、完了するように指示すると、後続のすべてのコミットが順番に再適用されます。
$ git rebase --continue
これには1、2分かかります。
これで、バイナリが出入りすることのないレポができました。ただし、デフォルトでは、Gitはガベージコレクションが可能になるまで30日間変更を保持するため、スペースを占有します。これにより、気が変わる可能性があります。今すぐ削除したい場合:
$ git reflog expire --expire=1.minute refs/heads/master
#all deletions up to 1 minute ago available to be garbage-collected
$ git fsck --unreachable # lists all the blobs(files) that will be garbage-collected
$ git prune
$ git gc
これで、膨張を取り除きましたが、残りの履歴は保持しました。