2012-06-15 13 views
16

Mam duży projekt, nad którym pracuję, który używa git jako VCS. W każdym momencie pracuję nad implementacją kilku funkcji/poprawek itp. Dla dowolnej funkcji/błędu byłoby dobrze stworzyć hierarchię oddziałów - np.Organizowanie gałęzi git

$ git branch 
    feature1 
     sub-branch1 
     sub-branch2 
     sub-branch3 
    feature2 
     sub-brancha 
     *sub-branchb #<--currently checked out 
     sub-branchc 
    bugfix1 
     sub-branch-foo 

$ git checkout sub-brancha 
$ git branch 
    feature1 
     sub-branch1 
     sub-branch2 
     sub-branch3 
    feature2 
     *sub-brancha #<--currently checked out 
     sub-branchb 
     sub-branchc 
    bugfix1 
     sub-branch-foo 

Czy można zrobić coś takiego, czy muszę przyjąć bardziej prymitywny schemat nazewnictwa?

EDIT

Aby uczynić go nieco bardziej konkretne, co szukam, jeśli Feature1 jest oddział git, to w powyższym przykładzie, sub-branch1 by wszystko zostało stworzone przez git checkout -b sub-branch1 z feature1 gałąź (która jest rozgałęziona od wzorca). np:

$ git checkout master 
$ git checkout -b feature1 
$ git checkout -b testing 
$ git branch 
master 
    feature1 
    *testing 
$ git checkout master 
$ git checkout -b feature2 
$ git branch 
master 
    feature1 
     testing 
    *feature2 

Mając git branch prostu organizować oddziały przez skąd one pochodzą (z niewielką dodatkową wcięcia) jest prawdopodobnie wystarczająco dobre dla moich celów ... Chociaż punktów bonusowych Super jeśli mogę mieć:

$ git branch 
    feature1 
     testing 
    feature2 
     testing 
    bugfix1 
     sub-branch-foo 

w jakiś sposób zarządzać imienin konflikt między "Feature1/testowanie" i "feature2/testowanie"

+0

Dlaczego masz różne poddziały do ​​nowych funkcji? –

+1

@FatihArslan: Dlaczego nie? Funkcja nie zmienia tylko jednego kawałka kodu - funkcja może dotknąć całego garnka kodu, każdy kawałek, który można przetestować/rozwinąć osobno ... Albo mam funkcję alfa (stabilny-ish) i funkcję- beta (niestabilny). Wydaje mi się, że Alpha działa u mnie, ale beta wprowadza pewne zmiany w celu zwiększenia wydajności ... To dwa przypadki od samego początku. Jak widzę, powód, aby to zrobić, nie różni się niczym od przyczyny posiadania oddziałów w pierwszej kolejności. – mgilson

+0

Jakie jest pytanie? Zastanawiasz się, czy możesz rozgałęziać gałęzie lub czy możesz zmienić format wyjściowy 'git branch'? –

Odpowiedz

14

można użyć schematy nazewnictwa jak Feature1/sub-brancha, feature2/sub-branchb i tak dalej, ukośnik w nazwie nie stanowi problemu dla gita. Jednak gałęzie będą nadal obsługiwane jako normalne gałęzie (ale nie wiedziałbym, jak można poradzić sobie z podgałęziami inaczej). Polecenie git branch wyświetli listę oddziałów oczywiście z pełną nazwą, a nie sposobem w tym przykładzie.

Co ciekawe, schematy nazewnictwa, w tym ukośniki, utworzą hierarchię katalogów w .git/refs/heads /. Może to jest przydatne do obsługi podgałęzi z niektórymi komendami niskiego poziomu?

+0

* westchnienie * - tego się obawiałem. Za każdym razem, gdy mam to zrobić, w końcu zapominam, a potem cały schemat wychodzi przez okno. Miałem nadzieję, że git może wyeliminować moje niezorganizowane skłonności ... – mgilson

+3

Możesz napisać małe narzędzie, aby wymusić swój schemat nazewnictwa. Może już wystarczą jakieś aliasy. Lub możesz rzucić okiem na [gitflow] (https://github.com/nvie/gitflow), który idzie nieco w tym kierunku (ale może nie być całkowicie tym, czego potrzebujesz). – jgosmann

+0

gitflow zdecydowanie wygląda jak krok we właściwym kierunku. Dzięki za ten link. – mgilson

2

Oddziały w Git są w rzeczywistości symbolicznymi odwołaniami do klucza w magazynie obiektów Gita. Zacytować dokumentację ("What is a branch"):

Kiedy trzeba być precyzyjnym, będziemy używać słowa „oddział” oznacza linię rozwoju, a „głową oddział” (lub po prostu „głowa”) oznacza odniesienie do ostatniego zatwierdzenia w oddziale. W powyższym przykładzie szef oddziału o nazwie "A" jest wskaźnikiem do jednego konkretnego zatwierdzenia, ale odnosimy się do linii trzech zatwierdzeń prowadzących do tego punktu, ponieważ wszystkie są częścią "oddziału A".

Git zarządza tylko listę odnośników, które są przechowywane w plikach pod .git/refs. Te odniesienia nie są po prostu zaprojektowane jako struktura podobna do drzewa.

Polecam użyć schematu nazewnictwa gałęzi, który przekazuje hierarchię.

Inną możliwością jest napisanie rozszerzenia, które obsługuje drzewo gałęzi.

+0

Ale podczas śledzenia pilotów ma on (prymitywną) strukturę podobną do drzewa ... (gałąź śledząca pilota wie, skąd pochodzi) - Dlaczego oddział nie może śledzić, skąd pochodzi? – mgilson

+0

Sądzę, że twórcy Git chcieli, aby było to tak proste, jak to tylko możliwe. Włączenie struktury drzewa dla oddziałów skomplikowałoby projekt. Ponieważ oddziały mogą pochodzić z innych oddziałów, nie ma problemu z porządkowaniem oddziałów w przyzwoitym schemacie nazewnictwa. Następnie jednak interpretacja drzewa należy do użytkownika. – migu

0

Osobiście zastosowałem podejście this we wcześniejszych wersjach Git, ale wygląda na to, że rozgałęzienia zagnieżdżone nie są już obsługiwane w wersji 1.8+.

Przyjemnie było zobaczyć wsparcie UI w Git Tower.

enter image description here

Powiązane problemy