2011-10-04 7 views
126

が、私は同じ質問があった:New git repository in root directory to subsume an exist repository in a sub-directoryfilter-branch --tree-filterの後にgit repoからrefs/original/heads/masterを削除しますか?ここで尋ねたよう

を私はここにこの答えを追っ:現在masterで最高潮に達する1、およびoriginal/refs/heads/masterという名前の1:今すぐNew git repository in root directory to subsume an exist repository in a sub-directory

を、gitk --allは2つの履歴を示します。

私はこの2番目の履歴は何か、またはどのようにリポジトリから削除するか分かりません。私は自分のリポジトリに2つの履歴は必要ありません。

どうすれば削除できますか?

mkdir -p project-root/path/to/module 
cd project-root/path/to/module 
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done 
git init 
git add . 
git commit -m 'Initial commit' 

今、私たちは、元のポスターの問題を抱えている:あなた自身を再現する

。 、今

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD 
rm -rf path 
cd ../../../ # Now PWD is project-root 
mv path/to/module/.git . 
git reset --hard 

私の現在の問題を参照してください:私はrefs/original/heads/masterを取り除くにはどうすればよい

gitk --all & 
git show-ref 

と関連するすべての歴史をのは、上記のリンクの答えを使用して、プロジェクトのルートにGitのレポのルートを移動してみましょう?

+1

可能重複-branch?](http://stackoverflow.com/questions/5984428/how-to-delete-the-old-history-after-running-git-filter-branch) – user

答えて

213

refs/original/*あなたのフィルタブランチを台無しにする場合は、バックアップとしてあります。私を信じて、それは本当に良いアイデアです。

あなたは結果を視察しました、そして、あなたが望むものを持っていることを非常に確信していたら、あなたはバックアップREF削除することができます。

git update-ref -d refs/original/refs/heads/master 

をしたり、多くの参照文献にこれをしなかった場合、およびあなたはそれをすべてを一掃したい:(。それは、フィルタ分岐のmanページから直接取られています)

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 

これはあなたに、これを見つけることが他の人には適用されません。その場合はフィルターブランch が重要なディスク容量を占めるコンテンツを削除した場合は、git reflog expire --expire=now --allgit gc --prune=nowを実行して、リフログを期限切れにして、未使用のオブジェクトを削除することもできます。 (警告:完全に、完全に不可逆的なあなたがそれを行う前に、非常に確認してください。)

+0

update-refを実行した後、reflogの有効期限が切れ、gc 'git update-ref -d refs/original/refs/heads/refs/.git/packed-refs 'を参照してください。これらのファイルは、依然として元の参照:.git/info/refsと.git/packed-refsを参照します。 代わりに、マスター ' – lhunath

+1

私はあなたが誤ってthを混ぜ合ったと思いますe言葉:私が正しいとすれば、 'git update-ref -d original/refs/heads/master'でしょうか?しかし、あなたの2番目のコマンドだけが私のために働いた。 – JJD

+4

'git update-ref -d refs/original/refs/heads/master' btwです。 'git show-ref'を使ってフルネームを見ることができます。 – poke

4

そして、あなたにはWindows PowerShellにいる場合:gitのフィルタを実行した後に、古い履歴を削除する【使い方の

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }