Удалите ссылки / оригинал / головы / мастера из репозитория git после filter-branch --tree-filter? - PullRequest
153 голосов
/ 05 октября 2011

У меня возник тот же вопрос, что и здесь: Новый репозиторий 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-репозитория в 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 и всей связанной истории?

Ответы [ 3 ]

279 голосов
/ 05 октября 2011

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 для истечения срока действия ваших reflogs и удаления неиспользуемых объектов. (Предупреждение: полностью, полностью необратимый. Будьте уверены, прежде чем сделать это.)

9 голосов
/ 13 января 2017

А если вы в Windows PowerShell:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
2 голосов
/ 19 сентября 2018

filter-branch хранит резервные копии, поэтому хранилищу необходимо очистить reflogs и сборщик мусора. Убедитесь, что вам не нужны эти резервные копии перед удалением:

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