2012-06-15 26 views
16

Ho un progetto di grandi dimensioni che sto lavorando su cui git viene utilizzato come VCS. In qualsiasi momento sto lavorando sull'implementazione di alcune funzionalità/correzioni di errori, ecc. Per ogni funzionalità/bug, sarebbe bello creare una gerarchia di rami - ad es.Organizzare i rami di 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 

È possibile eseguire qualcosa di simile oppure è necessario adottare uno schema di denominazione più primitivo?

EDIT

per renderlo leggermente più concreto quello che sto cercando, se feature1 è un ramo git, quindi nell'esempio di cui sopra, sub-Branch1 sarebbero tutti sono stati creati dal git checkout -b sub-branch1 dal feature1 ramo (che è derivato dal master). ad esempio:

$ 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 

Avere git branch semplicemente organizzare rami da dove sono venuti (con un po 'indentazione extra) è probabilmente abbastanza buono per i miei scopi ... Anche se i punti super-bonus se posso avere:

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

Con qualche modo per gestire il nome-conflitto tra "feature1/testing" e "feature2/testing"

+0

Perché devi diversi rami secondari per i nuovi sviluppi funzionalità? –

+1

@FatihArslan: perché no? Una funzionalità non cambia solo un singolo pezzo di codice - Una funzionalità potrebbe toccare un intero gruppo di codice, ogni pezzo che può essere testato/sviluppato separatamente ... Oppure ho feature-alpha (stable-ish) e feature- beta (instabile). Alpha sembra funzionare per me, ma la beta apporta alcune modifiche per aumentare le prestazioni ... Sono due casi in cima alla mia testa. Per come la vedo io, la ragione per farlo non è diversa dalla ragione per avere filiali in primo luogo. – mgilson

+0

Qual è la domanda? Ti stai chiedendo se riesci a creare rami dai rami o se puoi cambiare il formato di output 'git branch'? –

risposta

14

È possibile utilizzare uno schemi di denominazione come feature1/sub-brancha, feature2/sub-branchb e così via, la barra nel nome non è un problema per git. Tuttavia, i rami continueranno a essere gestiti come rami normali (ma non saprei come si possa gestire in modo diverso i sottoregioni). Il comando git branch elencherà ovviamente i rami con il suo nome completo e non il modo in cui è nell'esempio.

È interessante notare che gli schemi di denominazione che includono le barre creeranno una gerarchia di directory in .git/refs/heads /. Forse è utile per gestire i subbranches con alcuni comandi di basso livello?

+0

* sigh * - questo è quello che temevo. Ogni volta che ho deciso di farlo, finisco per dimenticare e poi l'intero schema esce dalla finestra. Speravo che git potesse eliminare le mie tendenze disorganizzate per me ... – mgilson

+3

Potresti scrivere un piccolo strumento per rafforzare il tuo schema di denominazione. Forse alcuni alias possono già bastare. Oppure puoi dare un'occhiata a [gitflow] (https://github.com/nvie/gitflow) che va un po 'in questa direzione (ma potrebbe non essere completamente quello di cui hai bisogno). – jgosmann

+0

gitflow sembra decisamente un passo nella giusta direzione. Grazie per questo link. – mgilson

2

I rami in Git sono in effetti riferimenti simbolici a una chiave nell'archivio oggetti di Git. Per citare la documentazione ("What is a branch"):

Quando abbiamo bisogno di essere precisi, useremo la parola "ramo" per indicare una linea di sviluppo, e la "testa ramo" (o semplicemente "testa") per indicare un riferimento al commit più recente su un ramo. Nell'esempio sopra, la diramazione di ramo denominata "A" è un puntatore a un commit particolare, ma ci riferiamo alla linea di tre commit che portano a quel punto essendo tutti parte del "ramo A".

Git riesce solo un elenco di riferimenti che vengono memorizzati in file sotto .git/refs. Questi riferimenti non sono semplicemente progettati come una struttura ad albero.

Si consiglia di utilizzare uno schema di denominazione del ramo che trasmetta la gerarchia.

Un'altra possibilità è scrivere un'estensione che gestisce l'albero del ramo per te.

+0

Ma, nel tracciare i telecomandi, ha una (primitiva) struttura ad albero ... (un ramo che rileva un remoto sa da dove proviene) - Perché un ramo non può tenere traccia di dove proviene da localmente? – mgilson

+0

Immagino che i creatori di Git volessero mantenerlo il più semplice possibile. Incorporare una struttura ad albero per i rami complicherebbe il design. Poiché i rami possono essere derivati ​​da altri rami, non è un problema organizzare i rami in uno schema di denominazione decente. Quindi, tuttavia, l'interpretazione dell'albero è compito dell'utente. – migu

0

Ho utilizzato personalmente l'approccio this nelle versioni precedenti di Git, ma sembra che i rami nidificati non siano più supportati nella versione 1.8+.

È stato anche bello vedere il supporto dell'interfaccia utente in Git Tower.

enter image description here