Mam kilka starych gałęzi w moim repozytorium git, które nie są już aktywnie rozwijane. Chciałbym zarchiwizować gałęzie, aby nie wyświetlały się domyślnie podczas działania git branch -l -r
. Nie chcę ich usuwać, ponieważ chcę zachować historię. W jaki sposób mogę to zrobić?
Wiem, że można utworzyć ref poza refs / heads. Na przykład refs/archive/old_branch
. Czy są jakieś konsekwencje takiego postępowania?
git checkout [rev] file
Attic/<branchname>
Jednak do archiwizacji oddziałów używam lekkich tagów.Odpowiedzi:
Uważam, że właściwym sposobem jest oznaczenie gałęzi. Jeśli usuniesz gałąź po jej otagowaniu, to skutecznie ją utrzymasz, ale nie zaśmieci ona twojej listy.
Jeśli chcesz wrócić do oddziału, po prostu sprawdź tag. Skutecznie przywróci gałąź ze znacznika.
Aby zarchiwizować i usunąć gałąź:
Aby przywrócić gałąź jakiś czas później:
Historia oddziału zostanie zachowana dokładnie tak, jak wtedy, gdy go oznaczyłeś.
źródło
git checkout -b <branchname> archive/<branchname>
branch -D
ponieważ prawdopodobnie nie zostanie w pełni scalona, jeśli zarchiwizujesz ją w ten sposóbOdpowiedź Jeremy'ego jest w zasadzie poprawna, ale polecenia IMHO, które określa, nie są całkiem poprawne.
Oto jak zarchiwizować gałąź do znacznika bez konieczności pobierania gałęzi (a zatem bez konieczności kasowania do innej gałęzi przed usunięciem tej gałęzi):
A oto jak przywrócić gałąź:
źródło
Tak, możesz utworzyć odwołanie za pomocą niestandardowego prefiksu
git update-ref
. na przykładgit update-ref refs/archive/old-topic topic && git branch -D topic
git branch topic refs/archive/old-topic
Referencje z niestandardowym prefiksem (tutaj
refs/archive
) nie pojawią się zwyklegit branch
,git log
anigit tag
. Nadal możesz je wymienićgit for-each-ref
.Używam następujących aliasów:
Możesz także skonfigurować piloty, takie jak
push = +refs/archive/*:refs/archive/*
automatyczne wypychanie zarchiwizowanych gałęzi (lubgit push origin refs/archive/*:refs/archive/*
jednorazowo).Innym sposobem jest zapisanie SHA1 gdzieś przed usunięciem gałęzi, ale ma ona ograniczenia. Zatwierdzenia bez żadnego refrenu zostaną GC'd po 3 miesiącach (lub kilku tygodniach bez reflogu) , nie mówiąc już o ręcznym
git gc --prune
. Zmiany wskazane przez referencje są bezpieczne od GC.Edycja: Znaleziono implementację perl tego samego pomysłu przez @ap :
git-attic
Edytuj ^ 2: Znaleziono wpis na blogu, w którym sam Gitster używa tej samej techniki.
źródło
Rozszerzyłem odpowiedź Steve'a, aby odzwierciedlić zmiany na pilocie
Aby przywrócić z pilota, zobacz to pytanie .
źródło
Możesz zarchiwizować gałęzie w innym repozytorium. Nie tak elegancki, ale powiedziałbym, że to realna alternatywa.
źródło
git-bundle
zamiast osobnego repozytorium.Oto alias tego:
Dodaj to w ten sposób:
Pamiętaj, że istnieje
git archive
już polecenie, więc nie możesz używać goarchive
jako pseudonimu.Możesz także zdefiniować alias, aby wyświetlić listę „zarchiwizowanych” gałęzi:
o dodawaniu aliasów
źródło
!git tag archive/$1 $1 && git branch -D
Używam następujących aliasów do ukrywania zarchiwizowanych gałęzi:
Aby
git br
pokazać aktywnie rozwijane gałęzie igit bra
wszystkie gałęzie, w tym te „zarchiwizowane” .źródło
Nie archiwizowałbym oddziałów. Innymi słowy, same oddziały archiwizują się. Chcemy, aby informacje istotne dla archeologów można było znaleźć w wiarygodny sposób. Niezawodny, ponieważ pomagają w codziennym rozwoju i nie stanowią dodatkowego kroku w procesie wykonywania pracy. Oznacza to, że nie sądzę, aby ludzie pamiętali, aby dodać tag po zakończeniu pracy z gałęzią.
Oto dwa proste kroki, które znacznie pomogą archeologii i rozwojowi.
git merge --no-ff
do scalania gałęzi zadań; chcesz, aby scalenie zatwierdzenia i historia bąbelkowały, nawet tylko dla jednego zatwierdzenia.Otóż to. Dlaczego? Ponieważ jako archeolog kodu rzadko zaczynam od chęci dowiedzenia się, jakie prace wykonano na gałęzi. O wiele częściej
to dlatego w tych wszystkich krzyczących dziewięciu piekłach kod jest napisany w ten sposób ?!Muszę zmienić kod, ale ma on pewne dziwne funkcje i muszę je rozszyfrować, aby uniknąć zepsucia czegoś ważnego.Następnym krokiem jest
git blame
znalezienie powiązanych zatwierdzeń, a następnie nadzieja, że komunikat dziennika jest objaśniający. Jeśli będę musiał kopać głębiej, dowiem się, czy praca została wykonana w oddziale i przeczytam gałąź jako całość (wraz z komentarzem w module do śledzenia problemów).Powiedzmy
git blame
punkty przy zatwierdzeniu XYZ. Otwieram przeglądarkę historii Git (gitk, GitXgit log --decorate --graph
itp.), Znajduję XYZ i widzę ...Tam jest mój oddział! Wiem, że QQ, UU, XYZ, JJ i MM są częścią tego samego oddziału i powinienem zapoznać się z ich komunikatami dziennika, aby uzyskać szczegółowe informacje. Wiem, że GG będzie zatwierdzeniem scalania i będzie miało nazwę oddziału, który, mam nadzieję, jest związany z problemem w module śledzącym.
Jeśli z jakiegoś powodu chcę znaleźć starą gałąź, mogę uruchomić
git log
i wyszukać nazwę gałęzi w zatwierdzeniu scalania. Jest wystarczająco szybki nawet w bardzo dużych repozytoriach.Właśnie to mam na myśli, mówiąc, że oddziały same się archiwizują.
Oznaczanie każdej gałęzi dodaje niepotrzebną pracę do wykonania zadania (krytyczny proces, który powinien być bezwzględnie usprawniony), rozbija listę tagów (nie mówiąc o wydajności, ale czytelność dla człowieka) za pomocą setek tagów, które są bardzo okazjonalnie przydatne i nie jest nawet bardzo przydatne w archeologii.
źródło
Moje podejście polega na zmianie nazwy wszystkich gałęzi, na których mi nie zależy, z prefiksem „kosz”, a następnie użyć:
(z powiązaniem klucza powłoki)
Aby zachować kolor aktywnej gałęzi, potrzebne byłyby:
źródło
Możesz użyć skryptu, który zarchiwizuje gałąź dla Ciebie
archbranch
Tworzy dla ciebie tag z archiwum prefiksu /, a następnie usuwa gałąź. Ale sprawdź kod przed użyciem.
Stosowanie -
$/your/location/of/script/archbranch [branchname] [defaultbranch]
Jeśli chcesz uruchomić skrypt bez zapisywania lokalizacji, dodaj go do swojej ścieżki
Następnie możesz to nazwać
Jest
[defaultbranch]
to gałąź, do której przejdzie po zakończeniu archiwizacji. Istnieją pewne problemy z kodowaniem kolorami, ale inne niż to powinno działać. Używam go w projektach od dłuższego czasu, ale wciąż jest w fazie rozwoju.źródło
Czasami archiwizuję oddziały w następujący sposób:
format-patch <branchName> <firstHash>^..<lastHash>
(Pobierz firstHash i lastHash używającgit log <branchName>
.git branch -D <branchName>
„Zastosuj” łatkę, gdy musisz ponownie użyć gałęzi; jednak stosowanie plików łatek (patrz
git am
) może być trudne w zależności od stanu gałęzi docelowej. Zaletą tego podejścia jest umożliwienie zbierania śmieci oddziału i oszczędność miejsca w repozytorium.źródło