2009-08-20 9 views
200

Mam kilka starych gałęzi w moim repozytorium git, które nie są już pod aktywnym rozwojem. 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ę. Jak mogę to zrobić?Jak mogę archiwizować oddziały GIT?

Wiem, że możliwe jest utworzenie ref poza refs/heads. Na przykład: refs/archive/old_branch. Czy są jakieś tego konsekwencje?

+0

git-rm nie usuwa zasobów z repozytorium, usuwa je tylko z indeksu http://www.kernel.org/pub/software/scm/git/docs/git-rm.html Możesz łatwo przywrócić te zasoby przy użyciu 'git checkout [rev] file' –

+1

Nie wiem o tym. Używam 'Attic/' lekkich tagów do archiwizacji gałęzi. Znaczniki –

+0

to szybki i bezpieczny wybór. – kch

Odpowiedz

259

wierzę właściwy sposób to zrobić, aby oznaczyć oddział. Jeśli usuniesz gałąź po tym, gdy ją oznaczysz, skutecznie zachowasz oddział, ale nie zaśmieje twojej listy oddziałów.

Jeśli chcesz wrócić do oddziału po prostu sprawdź tag. Skutecznie przywróci gałąź z tagu.

Aby zarchiwizować i usunąć gałąź:

git tag archive/<branchname> <branchname> 
git branch -d <branchname> 

Aby przywrócić gałąź jakiś czas później:

git checkout -b <branchname> archive/<branchname> 

Historia oddziału zostaną zachowane dokładnie jak to było, kiedy go określili.

+8

Jestem początkującym Git, ale próbując tego, myślę, że właściwą komendą do przywrócenia gałęzi jest: 'git checkout -b archiwum/' – Steve

+5

Czy jest jakikolwiek powód, aby nie używać znacznika object w tym przypadku ? Będąc w stanie zobaczyć, kto zarchiwizował oddział i kiedy mógł być interesujący. –

+0

@ GrégoryJoseph co to jest? –

13

Można archiwizować gałęzie w innym repozytorium. Nie aż tak elegancko, ale powiedziałbym, że to realna alternatywa.

git push git://yourthing.com/myproject-archive-branches.git yourbranch 
git branch -d yourbranch 
+4

Możesz utworzyć 'git-bundle' zamiast osobnego repozytorium. –

87

Odpowiedź Jeremy'ego jest w zasadzie poprawna, ale IMHO polecenia, które określa, nie są całkiem poprawne.

Oto jak archiwizować oddział do tagu bez kasy oddziału (a zatem bez konieczności kasy do innej gałęzi, zanim będzie można usunąć tę gałąź):

> git tag archive/<branchname> <branchname> 
> git branch -D <branchname> 

A oto jak przywrócenia oddziału:

> git checkout -b <branchname> archive/<branchname> 
+11

Myślę, że nie masz jeszcze wystarczającej liczby punktów, ale byłoby lepiej, gdybyś po prostu edytował istniejącą odpowiedź - +1 mimo wszystko :) – jkp

5

Używam następujących aliasów ukryć zarchiwizowane oddziały:

[alias] 
    br = branch --no-merge master # show only branches not merged into master 
    bra = branch     # show all branches 

Tak git br, aby pokazać aktywnie rozwinięte oddziały i git bra, aby wyświetlić wszystkie gałęzie, w tym "zarchiwizowane".

+1

To, czy oddział został scalony w master, nie ma nic wspólnego z jego stanem archiwum. Na przykład w moim zespole programistów mamy kilka gałęzi, które zostały stworzone specjalnie do testowania rzeczy. Chcemy zachować te gałęzie w naszym archiwum, ale zdecydowanie nie chcemy ich scalać w mistrza. – Bart

0

Można użyć skryptu który będzie archiwizacji gałąź Ci

archbranch

Tworzy znacznik do ciebie z archiwum prefiksem /, a następnie usuwa oddział. Ale sprawdź kod, zanim go użyjesz.


Wykorzystanie - $/your/location/of/script/archbranch [branchname] [defaultbranch]

Jeśli chcesz uruchomić skrypt bez pisania lokalizację do niej dodać go do ścieżki

Następnie można wywołać go

$ archbranch [branchname] [defaultbranch] 

[defaultbranch] to gałąź, do której przejdzie po zakończeniu archiwizacji. Występują pewne problemy z kodowaniem kolorów, ale inne, że powinno działać. Używam go w projektach przez długi czas, ale wciąż jest w fazie rozwoju.

+1

Per Stack Overflow [Pomoc] (http://stackoverflow.com/help/behavior), musisz ujawnić swoją przynależność do swojego produktu. – LittleBobbyTables

+0

Och, przepraszam, nie wiedziałem. Jestem autorem skryptu. – Banezaka

2

Nie będę archiwizować oddziałów. Innymi słowy, gałęzie same się archiwizują. To, czego potrzebujesz, to zapewnienie wiarygodnych informacji dla archeologów. Niezawodny w tym, że pomagają w codziennym rozwoju i nie stanowią dodatkowego kroku w procesie wykonywania pracy. Oznacza to, że nie wierzę, że ludzie będą pamiętać o dodaniu znacznika, gdy skończą z odgałęzieniem.

Oto dwa proste kroki, które znacznie ułatwią rozwój archeologii i.

  1. Link each task branch with an associated issue in the issue tracker using a simple naming convention.
  2. Zawsze używaj git merge --no-ff do łączenia gałęzi zadań; chcesz to zatwierdzenie scalenia i bańki historii, nawet dla jednego zatwierdzenia.

To wszystko. Czemu? Ponieważ jako archeolog kodowy, rzadko zaczynam od chęci dowiedzenia się, jaka praca została wykonana w oddziale. Zdecydowanie częściej dlatego w całym tym wrzeszczącym dziewięciu piekłach jest kod napisany w ten sposób ?! Potrzebuję zmienić kod, ale ma on kilka dziwnych funkcji i muszę je rozwiązać, aby uniknąć zerwania czegoś ważnego.

Następnym krokiem jest git blame, aby znaleźć powiązane zatwierdzenia, a następnie mieć nadzieję, ż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 przeczytaniu oddziału jako całości (wraz z komentarzem w narzędziu do śledzenia problemów).

Powiedzmy, że git blame punktów przy zatwierdzeniu XYZ. I otworzyć przeglądarkę Historia Git (gitk, GitX, git log --decorate --graph, etc ...), znaleźć i zobaczyć popełnić XYZ ...

AA - BB - CC - DD - EE - FF - GG - II ... 
    \      /
     QQ - UU - XYZ - JJ - MM 

Jest mój oddział! Wiem, że QQ, UU, XYZ, JJ i MM są częścią tego samego oddziału i powinienem przyjrzeć się ich komunikatom dziennika w celu uzyskania szczegółów. Wiem, że GG będzie zobowiązaniem scalającym i będzie mieć nazwę oddziału, który, mam nadzieję, jest powiązany z problemem w trackerze.

Jeśli z jakiegoś powodu chcę znaleźć stary oddział, mogę uruchomić git log i wyszukać nazwę oddziału w zatwierdzeniu scalenia. Jest wystarczająco szybki nawet na bardzo dużych repozytoriach.

To właśnie mam na myśli, gdy mówię, że gałęzie same się archiwizują.

Oznaczanie każdej gałęzi niepotrzebnie zajmuje się robieniem spraw (krytycznym procesem, który powinien być bezwzględnie usprawniony), gumuje listę tagów (nie mówiąc o wydajności, ale czytelność człowieka) za pomocą setek tagów, które są bardzo rzadko przydatne i nie jest nawet bardzo przydatny w archeologii.

+0

Ale co z bałaganem? Być może, gdyby istniał sposób na ukrycie starych gałęzi poniżej 10 metrów sześciennych ziemi. – bvj

7

Oto aliasem że:

arc = "! f() { git tag archive/$1 $1 && git branch -D $1;}; f" 

Dodaj to tak:

git config --global alias.arc '! f() { git tag archive/$1 $1 && git branch -D $1;}; f' 

Należy pamiętać, że jest git archive komenda już tak nie można używać archive jako alias.

Ponadto można zdefiniować alias aby wyświetlić listę oddziałów „archiwum”:

arcl = "! f() { git tag | grep '^archive/';}; f" 

about adding aliases

+1

W nowszych wersjach git (zgodnie z sugestią [tutaj] (https://stackoverflow.com/a/7534289/431033)), ten alias zapewnia zakończenie: archiwum tagu!! Git/1 $ 1 $ && git branch -D' – Lack

1

Moje podejście jest przemianować wszystkie branże Nie dbam o z „trash_” przedrostek, a następnie użyć:

git branch | grep -v trash 

Aby zachować zabarwienia się aktywnej gałęzi, należałoby:

git branch --color=always | grep --color=never --invert-match trash 
9

Tak, można utworzyć wartość ref z niestandardowym przedrostkiem przy użyciu git update-ref (np. git update-ref refs/archive/old-topic topic.) Dotychczas nie widziałem problemu. W przeciwieństwie do normalnych gałęzi lub tagów, nie będą one wyświetlane na zwykłych git branch, git log ani git tag (podczas gdy można je zobaczyć z git log --all).

Kopiowanie SHA1 wystarcza na krótką metę, ale zatwierdza bez żadnych poprawek będzie GC'd after 3 months (or a couple of weeks without reflog). Zaangażowania z danymi są bezpieczne.

Używam następujące aliasy:

[alias] 
    archive-ref = "!git update-ref refs/archive/$(date '+%Y%m%d-%s')" 
    list-archive-ref = for-each-ref --sort=-authordate --format='%(refname) %(objectname:short) %(contents:subject)' refs/archive/ 
    rem = !git archive-ref 
    lsrem = !git list-archive-ref 

Również może chcesz skonfigurować piloty jak push = +refs/archive/*:refs/archive/* automatycznie pchania (dla jednej lub git push origin refs/archive/*:refs/archive/*-shot).

Edit: Znaleziony Perl implementacja tego samego pomysłu przez @ap: git-attic

Edycja^2: Znaleziony a blog post gdzie sam Gitster przy użyciu tej samej techniki.

+0

Excellent , oprócz wszystkich pozostałych w tym wątku, faktycznie odpowiedziałeś na pytanie. – tzrlk

6

Rozszerzanie Steve answer odzwierciedlać zmiany na pilocie, zrobiłem

git tag archive/<branchname> <branchname> 
git branch -D <branchname> 
git branch -d -r origin/<branchname> 
git push --tags 
git push origin :<branchname> 

Aby przywrócić z pilota, patrz this question.

Powiązane problemy