2012-06-15 3 views
16

У меня есть большой проект, над которым я работаю, который использует git как VCS. В любой момент я работаю над внедрением нескольких функций/исправлений и т. Д. Для любой конкретной функции/ошибки было бы неплохо создать иерархию ветвей - например,Организация ветвей 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 

Возможно ли это сделать, или мне нужно принять более примитивную схему именования?

EDIT

Чтобы сделать его немного более конкретное, что я ищу, если feature1 это мерзавец ветвь, то в приведенном выше примере, к югу branch1 бы все были созданы git checkout -b sub-branch1 из feature1 ветвь (которая разветвлена ​​от мастера). например:

$ 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 

Имея мерзавец филиал просто организовать филиалы по откуда они пришли (с небольшим количеством дополнительного отступа), вероятно, достаточно хорошо для моих целей ... Хотя супер бонусных очков, если я могу иметь:

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

с каким-то образом управлять имя-конфликтом между «feature1/тестированием» и «feature2/тестированием»

+0

Почему у вас есть различные суб ветви для новых разработок функции? –

+1

@FatihArslan: Почему бы и нет? Функция не просто изменяет один кусок кода. Функция может касаться целого куча кода, каждая часть которого может быть протестирована/разработана отдельно ... Или у меня есть функция-альфа (стабильная-иш) бета (неустойчивый). Кажется, что Alpha работает для меня, но бета-версия делает некоторые изменения для повышения производительности ... Это два случая сразу с моей головы. Как я вижу, причина для этого ничем не отличается от причины иметь филиалы в первую очередь. – mgilson

+0

В чем вопрос? Вам интересно, можете ли вы отделить ветки от филиалов или изменить формат вывода «git branch»? –

ответ

14

Вы можете использовать наименование схемы, как feature1/суб-brancha, feature2/к югу branchb и так далее, слэш в имени не является проблемой для git. Однако ветви по-прежнему будут обрабатываться как обычные ветви (но я не знаю, как можно обрабатывать дочерние элементы по-разному). Команда git branch будет перечислять ветви, конечно, с полным именем, а не так, как показано на примере.

Интересно, что схемы именования, включая слэши, создадут иерархию каталогов в .git/refs/heads /. Может быть, это полезно для обработки суббров с помощью команд низкого уровня?

+0

* вздох * - это то, чего я боялся. Каждый раз, когда я собирался сделать это, я в конечном итоге забываю, а затем вся схема выходит из окна. Я надеялся, что git может устранить мои дезорганизованные тенденции для меня ... – mgilson

+3

Вы можете написать небольшой инструмент для обеспечения соблюдения схемы именования. Возможно, некоторых алиасов уже достаточно. Или вы можете взглянуть на [gitflow] (https://github.com/nvie/gitflow), который идет немного в этом направлении (но может быть не совсем то, что вам нужно). – jgosmann

+0

gitflow определенно выглядит как шаг в правильном направлении. Спасибо за эту ссылку. – mgilson

2

Филиалы в Git на самом деле символические ссылки на ключ в хранилище объектов Git. Процитируем документацию ("What is a branch"):

Когда мы должны быть точными, мы будем использовать слово «филиал» означает линию развития, и «ветви голова» (или просто «голова») означает ссылка на самую последнюю фиксацию на ветке. В приведенном выше примере заголовок ветви с именем «А» является указателем на один конкретный коммит, но мы ссылаемся на строку из трех коммитов, ведущих к этой точке, поскольку все они являются частью «ветки А».

Git управляет только список ссылок, которые хранятся в файлах под .git/refs. Эти ссылки просто не разработаны как древовидная структура.

Я рекомендую использовать схему именования ветвей, которая передает иерархию.

Другая возможность - написать расширение, которое обрабатывает дерево ветвей для вас.

+0

Но при отслеживании пультов он имеет (примитивную) древовидную структуру ... (ветвь отслеживания удаленного знает, откуда она взялась) - Почему ветка не может отслеживать, откуда она появилась локально? – mgilson

+0

Я думаю, создатели Git хотели, чтобы это было как можно проще. Включение древовидной структуры для филиалов усложнит дизайн. Поскольку ветви CAN могут быть получены из других ветвей, нет проблем с организацией филиалов в приличной схеме именования. Затем, однако, интерпретация дерева зависит от пользователя. – migu

0

Я использовал метод this в более ранних версиях Git, но кажется, что вложенные ветви больше не поддерживаются в версии 1.8+.

Было также приятно видеть поддержку интерфейса в Git Tower.

enter image description here

Смежные вопросы