Usuń refs / original / heads / master z repozytorium git po gałęzi filter - tree-filter?

180

Miałem to samo pytanie, jakie tu zadałem: Nowe repozytorium git w katalogu głównym, aby zasubskrybować istniejące repozytorium w podkatalogu

Podążyłem za tą odpowiedzią tutaj: Nowe repozytorium git w katalogu głównym, aby zasubskrybować istniejące repozytorium w podkatalogu

Teraz gitk --allpokazuje dwie historie: jedną kulminującą w bieżącej masteri drugą nazwaną original/refs/heads/master.

Nie wiem, co to za druga historia ani jak ją usunąć z repozytorium. Nie potrzebuję dwóch historii w moim repozytorium.

Jak się tego pozbyć?

Aby się odtworzyć:

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'

Teraz mamy problem z oryginalnym plakatem. Przenieśmy katalog główny repozytorium git do katalogu głównego projektu, korzystając z odpowiedzi podanej powyżej:

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

Teraz zobacz mój obecny problem:

gitk --all &
git show-ref

Jak pozbyć się refs/original/heads/mastercałej historii?

goofeedude
źródło

Odpowiedzi:

321

refs/original/*jest dostępny jako kopia zapasowa na wypadek, gdybyś zepsuł swoją gałąź filtrów. Uwierz mi, to naprawdę dobry pomysł.

Po sprawdzeniu wyników i upewnieniu się, że masz to, czego chcesz, możesz usunąć kopię zapasową:

git update-ref -d refs/original/refs/heads/master

lub jeśli zrobiłeś to wielu referencjom i chcesz to wszystko wymazać:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

(To jest pobierane bezpośrednio ze strony podręcznika gałęzi filtrów).

Nie dotyczy to ciebie, ale innych, którzy mogą to znaleźć: Jeśli wykonasz gałąź filtru, która usuwa zawartość zajmującą znaczną ilość miejsca na dysku, możesz również chcieć uruchomić git reflog expire --expire=now --alli git gc --prune=nowwygaśnąć swoje dzienniki rejestracyjne i usunąć nieużywane obiekty . (Ostrzeżenie: całkowicie, całkowicie nieodwracalne. Bądź pewien, zanim to zrobisz.)

Cascabel
źródło
Po wykonaniu update-ref, reflog wygasają i gc, oba te pliki nadal odwołują się do oryginalnego ref: .git / info / refs i .git /pack-refs Wygląda na to, że powinien to powiedzieć:git update-ref -d refs/original/refs/heads/master
lhunath
1
Chyba przypadkowo wymieszałeś słowa: Jeśli mam rację, powinno tak być git update-ref -d original/refs/heads/master? Jednak tylko twoje drugie polecenie działało dla mnie.
JJD,
4
To przy git update-ref -d refs/original/refs/heads/masterokazji. Możesz zobaczyć pełną nazwę używając git show-ref.
poke
4
A co z krótszym git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
CharlesB
11

A jeśli korzystasz z Windows PowerShell:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }
Guilherme Duarte
źródło
6

filter-branchprzechowuje kopie zapasowe, więc repozytorium musi wyczyścić dzienniki i śmieci. Upewnij się, że nie ma potrzeby tworzenia kopii zapasowych przed usunięciem:

rm -Rf .git/refs/original
git gc --aggressive --prune=now
Kiryl Plyashkevich
źródło