2009-08-01 26 views
48

私の個人的なgitリポジトリには、もはや必要のない小さな画像が何千もあるディレクトリがあります。 gitの履歴全体からそれらを削除する方法はありますか?私はディレクトリをgitから永久に削除します

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch imgs" HEAD 

git filter-branch --tree-filter 'rm -fr imgs' HEAD 

を試してみましたが、Gitのレポの大きさは変わりません。何か案は?

おかげ

+2

わかりませんが、 'git gc'を実行してみましたか?おそらく彼らはまだゴミとして残っているでしょう... –

+0

@Martinho:はい私は – adk

+0

古い参照(例:ブランチ名、タグ)をすべて削除し、後で 'git gc --aggressive'を実行する必要があります。 – vdboor

答えて

15

を行います。 は、私が最も信頼性の高い、単に別のレポにローカルに引っ張ってあったが見つかりました:

git pull file://$(pwd)/myGitRepo 

それはまた、あなたのdeletig古いタグの手間を節約できます。

は私のブログ上での話を参照してください。 http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/

+0

これは私にとっては近いと思われます。 //www.somethingorothersoft.com/?p = 80 –

32

ProGitブックがRemoving Objectに興味深いセクションがあります。

これはこれで終わらないん

あなたの歴史は、もはやそのファイルへの参照が含まれています。
reflogfilter-branch.git/refs/originalの下に置いたときにGitが追加した新しいリファレンスセットがあるので、削除してからデータベースを再パックする必要があります。あなたが再梱包する前にそれらの古いコミットへのポインタを持っているものを取り除く必要があります。

$ rm -Rf .git/refs/original 
$ rm -Rf .git/logs/ 
$ git gc 
$ git prune --expire 

git prune --expireは必須ではなく、緩やかなオブジェクトからディレクトリの内容を削除することができます)
バックアップすべてを行う前に、これらのコマンドはちょうどの場合);

+0

本へのリンクはもう役に立たない:-( – rescdsk

+3

@rescdsk私はリンクを復元しました – VonC

+0

恐縮です、ありがとう! – rescdsk

13

デフォルトでは、git-filter-branchは古い参照をrefs/original/*名前空間に保存します。

あなたがそれらを削除する必要が

、およびその後は、これらの技術のどれもが私をworkedforない実際git gc --prune=now

3

手動クリーンアップのルートを移動したい場合は、また、git-前に、元のブランチの位置に 参照を含むことができ、いくつかのより多くのファイルがありますフィルタブランチ。

.git /情報/レフリー:

179ad3e725816234a7182476825862e28752746dレフリー/元/レフリー/ヘッド/ホーム

は例えば、私は私の "ホーム" の枝を濾過しました。gitの/パック-レフリー:

179ad3e725816234a7182476825862e28752746dレフリー/元/レフリー/ヘッド/ホーム

私はこれらの行を削除した後、gitkは古いが、それ以上のコミットは表示されませんでした。これはちょうどgitkビューを固定した場合や、引用文献が本当に消えてしまいます場合ライナーBlomeのソリューションへのコメントで尋ねた

+1

私のために働いていましたが、これはちょうどgitkのビューを修正したのか、それとも実際にはrefが実際にgc'dになるのか不思議です。 – gravitation

10

ブランドントムソン。これをチェックするための良い方法は、古いコミットのSHA1ハッシュの1つ(またはそれのユニークなプレフィックスを)覚えて、それがであったようにこれはあなたのレポメインフォルダの内容を表示する必要があります

$ git ls-tree hash-value 

を試してみることですこのコミット。

$ rm -Rf .git/refs/original 
$ rm -Rf .git/logs/ 

VonCで示すようライナーBlomeによって示されるように.git/info/refs.git/packed-refsからrefs/original/…線を除去した後、最終

$ git gc --prune=now 

は参考文献だけでなくなさなく、古いですオブジェクト(コミット、ツリー、およびブロブ)は消えます。上記のgit ls-tree hash-valueがこれを証明しています。 これをチェックするもう1つの良いコマンドは、git count-objects -vです(フィルタブラッチの前とプルーニング後に実行してサイズを比較します)。

注:私はまだ他の回答にコメントすることはできませんので、主に以前の回答を組み合わせていますが、新しい回答を書く必要がありました。

+0

この答えは私にとって正しい解決策のようです。しかし、なぜ私のリポジトリの合計サイズは変更されていないのか分かりません。 – dbn

2

これは古い質問ですが、おそらくこれのうちのいくつかはおそらく不可能でした。これは、あなたがbashまたはcygwinを使用していることを前提としています。

警告: 2行目と3行目は、ブランチ/タグから到達できないすべてのコミットを完全に削除します。

filter-branchを実行した後、

for ref in $(git for-each-ref --format='%(refname)' refs/original); do git update-ref -d $ref; done 
git reflog expire --expire=now --all 
git gc --prune=now 

git for-each-ref --format='%(refname)'を行うと、参照名を取得し、git update-ref -dは、参照を削除します。 .gitフォルダを直接変更しない方が一般的です。特に、このコマンドは、参照がpacked-refsの場合に対応しています。

2番目と3番目の行は、How to clean up unused side-branches in your commit trees?から直接取得されます。

関連する問題