web-dev-qa-db-ja.com

履歴から(古い)gitcommitを完全に削除します

非常に大きなファイルをコミットするgitを使用してプロジェクトを開始していますが、週に数回しかコミットしていません。 gitをそのまま使用しようとしましたが、変更された各コミットにファイル全体が保存されているようです。これはこのプロジェクトでは機能せず、リポジトリが制御不能になります。そこで、リポジトリのサイズを小さくしたいと思います。

私の最初の考えは、2週間以上経過したすべてのコミットを「単に」削除するか、たとえば、歴史の中で5つのコミット(これはおそらくより良いです:))私はグーグルでGit Community Bookからたくさん読んだので、git-rebaseまたはgit-filter-branchで作業する必要があると思います。問題は、それを機能させることができないように見えることです。

説明のためだけに;ブランチが1つしかない履歴Hがあります(マスターブランチ)

A-> B-> C-> D-> E

以前のコミットをいくつか削除して、履歴を次のように見せたい

C-> D-> E

コミットAとBは完全に削除する必要があります。 git-rebaseを試しましたが、実際に古いコミットを削除するのではなく、コミットをマージしているようです。リベースがどのように機能するかを完全に理解していない可能性があります。別の考えは、.git/objectsからすべてを削除してからgit-hash-object -wgit-mktree、およびgit-commit-treeを使用して新しいコミットをビルドしますが、この「人工」ツリーをサーバーにプッシュすることはまだできていません。

私はどのブランチでも作業しないので、これらを考慮する必要はありません。

私が疑問に思っているのは、誰かがgit-rebaseの具体的な使用法を教えてくれるかどうかということです。それが私が使用することになっているのであれば、どうでしょうか。または他のいくつかのヒント、私ができることの例。

乾杯!


編集:

大きなファイルは常に同じ大きなファイルであるとは限らず、一部のファイルは新しいファイルに置き換えられます。これらの置き換えられたファイルを履歴から完全に削除にしたい。

28
Thinner

これはあなたが持っている単純なgit rebase -iでなければなりません

p A
s B
s C
p D
p E

次に、A-Cのコミットメッセージを編集して、Cのコミットメッセージにします。

git-rebaseは、すべてのコミットを1つのコミットに「押しつぶし」ます。このコミットのオブジェクトは、コミットCのオブジェクトと同じです。

注:必要に応じて、git filter-branchを使用して、前のコミットの大きなファイルを実際に新しいファイルと一致するように変更できる場合があります。しかし、それは危険な操作であり、私はあなたに事故で悪い命令を与えたくありません。

13
alternative