2012-06-15 180 views
43

ブランチにファイルのロードをチェックしてマージした後、それらを削除しなければならなかったので、取得する方法がわからない大きな.packファイルが残っています捨てる。gitで作成された大きな.packファイルを削除します

git rm -rf xxxxxxを使用してすべてのファイルを削除しましたが、--cachedオプションも実行しました。

誰かが、私は次のディレクトリに現在ある大.packファイル削除する方法を教えてもらえます:

.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack

を私はちょうど私がまだ持っていないが、もはや午前ブランチを削除する必要がありますかを使用して?それとも、実行する必要がある何か他にありますか?

どのくらいの違いがあるのか​​わかりませんが、ファイルに対して南京錠が表示されます。

おかげ


EDITここ

が、私はこの状態に入るために、管理方法のアイデアを与える必要があり、私のbash_historyからいくつか抜粋している(私はGitのブランチに取り組んでいます。この時点で想定し)「私のブランチ」と呼ばれ、私は複数のフォルダ/ファイルを含むフォルダを持っている:

git add . 
git commit -m "Adding my branch changes to master" 
git checkout master 
git merge my-branch 
git rm -rf unwanted_folder/ 
rm -rf unwanted_folder/  (not sure why I ran this as well but I did) 

私はまた、次のように走ったと思ったが、それはトンとbash_historyには表示されません。彼は他の人:

git rm -rf --cached unwanted_folder/ 

私も、私はパックファイルを整理しようとする(git gcのような)いくつかのgitコマンドを実行しましたが、それらはいずれかの.bash_historyファイルには表示されませんと思いました。

+0

削除方法を明確にすることはできますか?まだコミット履歴に残っている場合は、依然としてパックファイルに含まれています。 – loganfsmyth

+0

こんにちは@loganfsmyth、私はうまくいけば助けるbashの歴史のスクリプトを追加しました。 – user1116573

答えて

114

ファイルを削除したにもかかわらず、それらのファイルは以前のリビジョンにも残っています。それはgitの全体のポイントです。たとえあなたが何かを削除しても、あなたは履歴にアクセスすることでそれを取り戻すことができます。

あなたが探しているのは、書き換え履歴と呼ばれ、git filter-branchコマンドが含まれています。

GitHubには、そのサイトの問題の説明があります。

https://help.github.com/articles/remove-sensitive-dataがより直接的にあなたの質問に答えるために、何を基本的に実行するために必要なのはこれです:

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch unwanted_folder' --prune-empty 

これはレポの履歴からファイルへの参照をすべて削除します。

次に、これを実行してパックファイルから実際にファイルを削除します。

git gc --aggressive --prune 
+3

これは正解ではありません。 – Dvir669

+1

これは間違いなく受け入れられた答えになるはずです。 – JaKXz

+0

新鮮なgit repoを作成することで実際に私の問題を解決しましたが、それが今後この問題に遭遇する方が簡単になるなら、それを受け入れたとマークしました – user1116573

3

一つのオプション:手動

実行git gc 1つまたは少数のパックファイルにパックファイルの数を凝縮します。 この操作は、永続的である(すなわち、大きなパックファイルが圧縮挙動を保持します)ので、git gc --aggressive

別のオプションを使用して定期的にリポジトリを圧縮することが有益であり得ることは、コードを保存し、どこかに.git、その後、.gitを削除することですこの既存のコードを使ってやり直し、新しいgitリポジトリ(git init)を作成します。

+0

こんにちはMichael、私は 'git gc'を実行しようとしましたが、いくつかのパックファイルになってしまいましたが、大きなものはまだそれらの一つですが、私はそれを取り除きたいのですが、 (前のジップは1-2Mb、今は55Mbでした)。他に何か提案できる人がいない限り、私は新鮮なgitを作成しなければならないかもしれないと思う。これは、現在持っている支店にアクセスできなくなることを意味します...? – user1116573

+1

あなたが言ったように、私は試しをやめ、.gitフォルダを削除し、新しいgitリポジトリを作成しました。私はそれを学んだ教訓と考えます。ありがとうマイケル。 – user1116573

+2

これはあまり意味がありません。現在のリポジトリを統合し、プロセス中のパックファイルを削除するようgitに指示できないのはなぜですか? – jml

4

シナリオ:あなたの大きなファイルのみがブランチに追加された場合、あなたはgit filter-branchを実行する必要はありません。

git branch -D mybranch 
git reflog expire --expire-unreachable=all --all 
git gc --prune=all 

シナリオB:あなただけのブランチを削除して、ガベージコレクションを実行する必要があるしかし、それはあなたがマスターに変更をマージしなかったことを、あなたはbashの履歴に基づいてのように見えます。変更を誰とも共有していない場合は(git pushはまだありません)。一番簡単なのは、大きなファイルを持つブランチとマージする前にマスターをリセットすることです。これにより、ブランチからのすべてのコミットと、マージ後にマスターに行われたすべてのコミットが削除されます。だから、変更内容が失われる可能性があります - 大きなファイルに加えて - あなたが実際に思っていること:

git checkout master 
git log # Find the commit hash just before the merge 
git reset --hard <commit hash> 

次にシナリオA.

シナリオCからの手順を実行しますがあった場合ブランチからのその他の変更保存しておきたい、マージ後のマスターにまたは変化、それはマスターをリベースするのがベストだろうと、選択したいことをコミットし、次のとおりです

git checkout master 
git log # Find the commit hash just before the merge 
git rebase -i <commit hash> 

エディタで、大きなファイルを追加したコミットに対応する行を削除します。保存して終了します。あなたのマスターブランチには、あなたが望むものだけが入っていて、大きなファイルは含まれていないはずです。 のないgit rebaseはマージコミットを排除するので、<commit hash>の後にmasterの線形履歴を残します。これはおそらく大丈夫ですが、そうでない場合は-pで試すことができますが、git help rebasecombining -p with the -i option explicitly is generally not a good idea unless you know what you are doingと表示されます。

その後、私は別の方法を見つけた私はショーのために少し遅れていますが、場合には上記の答えは、クエリを解決していないシナリオA.

+0

シナリオAの亜種があります(http:// stackoverflow .com/q/33191910/4400585)、予期しない追加の問題があります。 –

関連する問題