Удалите ссылки / оригинал / головы / мастера из репозитория git после filter-branch --tree-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-репозитория в 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 ответа
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 и удалить теперь неиспользуемые объекты. (Предупреждение: полностью, полностью необратимый. Будьте уверены, прежде чем сделать это.)
А если вы в Windows PowerShell:
git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
filter-branch
хранит резервные копии, поэтому репозиторий должен убирать reflogs и собирать мусор. Убедитесь, что вам не нужны эти резервные копии перед удалением:
rm -Rf .git/refs/original
git gc --aggressive --prune=now