1. ホーム
  2. git

[解決済み] filter-branch --tree-filter の後に refs/original/heads/master を git repo から削除しますか?

2022-04-20 08:39:34

質問

こちらで質問されていることと同じ質問をさせていただきました。 ルートディレクトリに新しいgitリポジトリを作成し、サブディレクトリにある既存のリポジトリをサブジェクト化する。

こちらの回答に従いました。 ルートディレクトリに新しい git リポジトリを作成して、サブディレクトリにある既存のリポジトリをサブジェクト化する。

今すぐ gitk --all は、2つの歴史を示しています。1つは現在の master という名前のものと 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 と関連するすべての履歴を表示しますか?

解決方法は?

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

(これはfilter-branchのmanpageから直接引用したものです)。

これはあなたには当てはまりませんが、他の人がこれを見つけるかもしれません。もし、フィルターブランチを 削除 のコンテンツが大きなディスクスペースを取っている場合は、さらに git reflog expire --expire=now --allgit gc --prune=now を使って、リブログを失効させ、今は使われていないオブジェクトを削除してください。(警告: 完全に、完全に、元に戻せません。 実行する前によく確認してください)。