2012-10-12 11 views
10

かなり大きくなっている大きなバイナリファイル(tifs、jpgs、pdfs)を格納するリポジトリがあります。また、作成され、削除され、名前が変更されたかなりの量のファイルがあり、個々のコミット履歴は気にしません。この問題は、ブランチとタグを持たないリポジトリを扱っているため、いくぶん単純化されています。gitリポジトリから古いコミット情報を削除して、スペースを節約します。

スペースを節約するために履歴をシステムから削除する簡単な方法があるのか​​どうか不思議です。

私は古いスレッドon the git mailing listを見つけたが、それは本当に($降下があるつまり何)これを使用する方法を指定しません。

git filter-branch --parent-filter "sed -e 's/-p $drop//'" \ 
     --tag-name-filter cat -- \ 
     --all ^$drop 
+0

好奇心、あなたから10Gbのプロジェクトファイル、どのくらいのスペースを保存することができますか? 2Mbs? 25メガバイトまたは200メガバイトのような?! – Honey

+0

私の場合、リポジトリ内のファイルの90%がまだ必要だったので、スペースの10%しか保存しませんでした。 – greggles

+0

あなたは1Gbを保存しましたか?またはgitに関連するメタデータの10%?どのくらいでしたか? – Honey

答えて

8

私は、あなたがこの答え、次の履歴を縮小することができると思う:

How to delete a specific revision of a github gist?

は、あなたが残しておきたい、歴史の中でどの点を決定します。

pick <hash1> <commit message> 
pick <hash2> <commit message> 
pick <hash3> <commit message> <- keep 
pick <hash4> <commit message> 
pick <hash5> <commit message> 
pick <hash6> <commit message> <- keep 
pick <hash7> <commit message> 
pick <hash8> <commit message> 
pick <hash9> <commit message> 
pick <hash10> <commit message> <- keep 

次に、それぞれの "保持"の後に最初のままにして "選択"し、他のものを "スカッシュ"としてマークします。

pick <hash1> <commit message> 
squash <hash2> <commit message> 
squash <hash3> <commit message> <- keep 
pick <hash4> <commit message> 
squash <hash5> <commit message> 
squash <hash6> <commit message> <- keep 
pick <hash7> <commit message> 
squash <hash8> <commit message> 
squash <hash9> <commit message> 
squash <hash10> <commit message> <- keep 

次に、エディターを保存して終了して、リベースを実行します。各 "保留"ポイントでは、前の "ピック"から "保留"コミットまでのコミットメッセージを結合したメッセージエディタがポップアップ表示されます。最後のメッセージを保持するか、実際にそれらを組み合わせて、すべての中間状態を維持せずに元の履歴を記録することができます。

その後、中間ファイルのデータはリポジトリに残りますが、参照されなくなります。 git gcは実際にそのデータを削除します。

+0

を参照してください。これは、私がちょうどすべてのコミット(またはXの前のすべてのコミット)を盛り上げるのが面倒だと思われるようです。より自動化された方法がありますか? – greggles

+0

また、私の全目標はディスク容量を節約することで、大きなリポジトリ(〜10GBの比較的大きなファイル)にどれくらいのスペースを節約するかという統計があるのだろうかと思います。私がメタデータを削除するだけで、削除されたオブジェクトに関する情報は削除しないと、これはあまり役に立ちません。 – greggles

+1

コミットを削除すると、メタデータとツリーデータへの参照が削除されます。つまり、最後の参照が削除された場合(他のコミットが特定の内容を参照していない場合)、次の 'gc'で実際のペイロードが削除されます。たとえば、指定したファイルをコミットまで追加してからコミットをすべて削除すると、ファイルデータは実際には 'gc'にドロップされます。 –

6

あなたはいつもちょうど.gitを削除し、1で新鮮なgit --initを行うことができます初期コミット。これは、もちろん、すべてを削除します。コミット履歴。あなたは、不要なファイルをクリーンアップし、ローカルリポジトリを最適化したい場合は

+0

うん、これを簡単ではっきりとした選択肢として間違いなく考えている。私は.gitリポジトリをアーカイブしてからこれを行うでしょう。私は少し劇的ではないものを期待しています:) – greggles

+0

'git init'。なぜ '--init'ですか? –

+1

基本的に: '移動.git/somewhere/else; git init; git add。 gitコミット-m "初期コミット"; git add origin [repoUrl]; git push origin --force' –

3

$降下が変数(あなたが探してしたいこと)

であるあなたは、コマンドにgit gc

そしてgit pruneをチェックしなければならないので、別のオプションです到達可能なブランチ内のオブジェクトによって、もはやポイントされていないオブジェクトが削除されます。

こちらがお役に立てば幸いです。

+0

これは履歴にまだ残っているオブジェクトには当てはまりませんが、これは私の質問が参照するものです。 –

+0

これらは参考になりますが、そのコマンドの使い方についてはまだ混乱しています(例:多かれ少なかれ履歴を保持するためにどのような引数を調整するかなど)。 – greggles

+0

"git gc"は "git prune"を呼び出します。 https://git-scm.com/docs/git-prune#_notes – Hackless

1

Gitヒストリーから大きなファイルを検索して削除する場合はPro GitRemoving Objectsというセクションがあり、このプロセスを順を追って説明します。それはちょっと複雑ですが、残った履歴をそのままにしながら、あなたが削除した履歴からファイルを削除することができます。

0

gitにファイルを忘れることは少し複雑です。

git rmは、このブランチのファイルを今から削除しますが、履歴に残っていてgitはそれを覚えています。

正しい方法はgit filter-branchで、他の人がここで述べたとおりです。ブランチの履歴にあるすべてのコミットを書き換えて、そのファイルを削除します。

しかし、それをしても、gitはreflog、remotes、タグなどで参照がある可能性があるので、覚えています。

私はそれだけでgit forget-blob file1.txtを行い、簡単ですgit forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

と呼ばれる小さなユーティリティを書きました。

これはすべての参照を削除します。を実行し、最後にgitガベージコレクタgit gcを実行して、このファイルをリポジトリから完全に削除します。

関連する問題