Видалити refs / original / heads / master з git repo після filter-branch --tree-filter?


180

У мене виникло те саме запитання, що і тут: Нове сховище 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 repo в проект-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 закінчуються і дс, обидва ці файли ще посилання на оригінал реф: .git / дані / рефов і .git / ущільнений позиками виглядає як , може бути, слід сказати , що це замість:git update-ref -d refs/original/refs/heads/master
lhunath

1
Гадаю, ви випадково змішали слова: Якщо я маю рацію, так і має бути git update-ref -d original/refs/heads/master? Однак на мене працювала лише ваша друга команда.
JJD

4
Це git update-ref -d refs/original/refs/heads/masterbtw. Ви можете побачити повне ім'я, використовуючи git show-ref.
ткнути

4
А що з коротшими git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
CharlesB


7

filter-branchзберігає резервні копії, тому сховище потребує очищення відходів та збирання сміття. Переконайтеся, що в цьому резервному копіюванні перед видаленням не потрібно:

rm -Rf .git/refs/original
git gc --aggressive --prune=now
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.