filter-branch --tree-filterの後でgit repoからrefs / original / heads / masterを削除しますか?


180

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

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

現在、gitk --all2つの履歴が表示されています。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関連するすべての履歴を削除するにはどうすればよいですか?


回答:


321

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

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

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

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

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

(これはフィルターブランチのマンページから直接取得されます。)

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


更新-REFを行った後、REFLOGの有効期限が切れると、GC、両方のこれらのファイルのまだ元の参照参照:多分それは代わりにこれを言う必要があるような.git /情報/レフリーと.git /がパック・レフリーのルックス:git update-ref -d refs/original/refs/heads/master
lhunath

1
誤って単語を混ぜたと思います:私が正しい場合、それは正しいはずgit update-ref -d original/refs/heads/masterですか?しかし、私には2番目のコマンドのみが機能しました。
JJD 2012

4
それはところであるgit update-ref -d refs/original/refs/heads/master。フルネームはを使用して確認できますgit show-ref
突く

4
短いのはgit show-ref refs/original/* --hash | xargs -n 1 git update-ref -dどうですか?
CharlesB 2013


7

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

rm -Rf .git/refs/original
git gc --aggressive --prune=now
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.