web-dev-qa-db-ja.com

filter-branch --tree-filterの後にgitリポジトリからrefs / original / heads / masterを削除しますか?

私はここで尋ねたのと同じ質問がありました: サブディレクトリに存在するリポジトリを取り込むためのルートディレクトリの新しいgitリポジトリ

私はここでこの答えに従いました: サブディレクトリに存在するリポジトリを取り込むためにルートディレクトリに新しいgitリポジトリ

現在、gitk --allには2つの履歴が表示されます。1つは現在のmasterで、もう1つはoriginal/refs/heads/masterという名前です。

この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リポジトリのルートをproject-rootに移動しましょう。

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

今、私の現在の問題を見てください:

gitk --all &
git show-ref

refs/original/heads/masterおよび関連するすべての履歴を削除するにはどうすればよいですか?

158
goofeedude

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

結果を確認し、必要なものがあると確信したら、バックアップされたrefを削除できます。

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

または、多くの参照に対してこれを行い、すべてを消去する場合:

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

(これは、フィルターブランチのマンページから直接取得したものです。)

これはあなたには当てはまりませんが、これを見つけるかもしれない他の人には:removesコンテンツがかなりのディスクスペースを占有するフィルターブランチを行うと、 git reflog expire --expire=now --allおよびgit gc --Prune=nowを実行して、reflogを期限切れにし、現在使用されていないオブジェクトを削除することもできます。 (警告:完全に、完全に元に戻すことはできません。実行する前に十分に確認してください。)

288
Cascabel

Windows PowerShellを使用している場合:

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

filter-branchはバックアップを保持するため、リポジトリはreflogとガベージコレクションをクリーンアップする必要があります。削除する前に、このバックアップで必要がないことを確認してください。

rm -Rf .git/refs/original
git gc --aggressive --Prune=now
3