Удалить refs/original/heads/master из git repo после фильтра-ветки - trree-filter?

У меня был тот же вопрос, что и здесь: Новый репозиторий git в корневом каталоге для размещения существующего репозитория в подкаталоге

Я воспользовался этим ответом здесь: Новый репозиторий git в корневом каталоге, чтобы включить существующий репозиторий в подкаталог

Теперь gitk --all показывает две истории: одна из них достигла высшей точки в текущем master, а другая - original/refs/heads/master.

Я не знаю, что это за вторая история, или как удалить ее из репо. Мне не нужны две истории в моем репозитории.

Как мне избавиться от него?

Чтобы воспроизвести себя:

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 в проект-корень, используя ответ, указанный выше:

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 и всей связанной истории?

Ответ 1

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

(Это взято непосредственно из man-страницы ветки фильтра.)

Это не относится к вам, но к тем, кто может найти это: если вы создаете ветвь фильтра, которая удаляет контент, занимающий значительное дисковое пространство, вы также можете запустить git reflog expire --expire=now --all и git gc --prune=now до истечения срока действия ваши рефлоги и удалить неиспользуемые объекты. (Предупреждение: полностью, абсолютно необратимо. Будьте уверены, прежде чем вы это сделаете.)

Ответ 2

И если вы находитесь в Windows PowerShell:

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

Ответ 3

filter-branch хранит резервные копии, поэтому репозиториям необходимо очистить файлы и сбор мусора. Перед удалением убедитесь, что в этой резервной копии нет необходимости:

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