работа с длинными именами веток в git и gitolite - PullRequest
4 голосов
/ 09 сентября 2011

Я использую рабочий процесс "Integration-Manager" с Git, а gitolite для управления разрешениями.У Gitolite есть эта удобная опция для простого управления личными ветками пользователя in:

refs/personal/USERNAME/USERBRANCHNAME

В нашем случае это единственные ветви, к которым у разработчиков есть доступ для записи.Это означает, что они регулярно извлекают данные из «благословенного» репозитория, который является «главной» веткой на «исходном» пульте, например так:

$ git pull origin master

Однако им необходимо регулярно возвращать свою работу обратнок их личным ветвям, например:

$ git push origin master:refs/personal/mysuername/mybranchname

Ввод этих длинных названий ветвей устареет, очень быстро, особенно для интегратора, которому приходится регулярно извлекать различные длинные имена ветвей.Большинство людей хотят напечатать что-нибудь попроще, например:

$ git push origin master:mybranchname

Итак, мой вопрос: «Как мне сделать это проще с более короткими именами и уменьшенными опечатками?»Есть ли способ создать псевдоним или ярлык для удаленной ветви пользователя?Наш интегратор хотел бы иметь возможность создавать псевдонимы для каждого разработчика, чтобы также упростить свои команды.

Кроме того, можно ли настроить git так, чтобы он всегда извлекал из одной ветви и передавал в другую ветку без необходимостиуказать имена удаленных и филиалов в обоих случаях?Это поможет нашим разработчикам, хотя это не поможет нашему интегратору.... Я знаком с настройкой единого значения по умолчанию для push и pull с одного и того же пульта и ветви , но в этом случае это не работает, так как ветви push и pull отличаются.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 09 сентября 2011

Да. Просто отследите ветку под другим именем. Смотрите страницу руководства по git branch и тому подобное --set-upstream.

Надеюсь, это поможет.

1 голос
/ 18 сентября 2011

Спасибо всем за вклад и предложения.Вот как я заставил своих разработчиков и интеграторов использовать голые git push и git pull:

для разработчика

В простейшем рабочем процессе интеграционного менеджера, как описано выше, разработчик клонировал(git clone) и, следовательно, автоматически отслеживает удаленную главную ветку в своей локальной главной ветке, поэтому все, что ей нужно:

git pull

Чтобы обновить свою локальную главную ветку.Если она работает в какой-то другой ветке, то она может обновить отслеживающую ветвь вверх по течению, как предложил Адам:

git branch --set-upstream MYOLDBRANCH origin/master
# or, use longer, more explicit syntax, like:
git branch --set-upstream MYOLDBRANCH refs/remotes/origin/master

Отслеживаемая ветвь (в данном случае origin / master) будет извлеченаdefault.

Так как заданная по умолчанию push-цель - это другая ветвь, а не одно и то же имя, мы не можем использовать push.default: отслеживание, текущий или сопоставление.Вместо этого, наш разработчик должен установить исходный код по умолчанию: refspec для всех сообщений в заданный пульт в своем файле .git / config, например:

[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = GITREPOHOSTNAME:REPONAME
        push = master:refs/personal/MYDEVNAME/MYBRANCHNAME

Она также может создать псевдоним, например:

git config alias.pushToMyBr 'push origin master:refs/personal/MYDEVNAME/MYBRANCHNAME

Псевдонимы очень мощные и обеспечивают максимальную гибкость во избежание нажатия клавиш.:-) Вышеприведенный случай может быть выполнен с простым:

git pushToMyBr

Для Интегратора

В этом простом случае интегратор обычно перемещается в одно место, источник / мастер.Если для push.default задано совпадение, отслеживание или ток, то будет работать «чистый» толчок, например:

git config push.default current
git checkout master
git push

Частое извлечение из различных личных веток разработчика - более сложный случай.Интегратор может использовать псевдонимы для упрощения задачи, например:

git config alias.pullFromXY 'pull origin refs/personal/DEVNAMEX/BRANCHNAMEY:master
# or, pull to a specific topic branch
git config alias.pullFromABtoC 'pull origin refs/personal/DEVNAMEA/BRANCHNAMEB:branchC'

Интегратор также может создавать ветви для отслеживания личных удаленных веток разработчика, например:

git checkout -b test_devXbranchY origin/personal/DEVNAMEX/BRANCHNAMEY
# or, use a more specific syntax:
git checkout -b test_devXbranchY refs/remotes/origin/personal/DEVNAMEX/BRANCHNAMEY

Для этогочтобы работать, интегратор должен добавить личные ветки в свой список выборки.Это может быть достигнуто путем непосредственного редактирования ее .git / config, например так: (Я не знаю, как это сделать с помощью git-config или любой другой команды git.)

[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = MYGITHOSTNAME:MYREPONAME
        fetch = +refs/personal/*:refs/remotes/origin/personal/*
        # Fetch a specific developer's branches:
        fetch = +refs/personal/devX/*:refs/remotes/origin/personal/devX/*

Спасибо всемза помощь!Надеюсь, что это поможет кому-то еще, кто использует гитолит и личные ветви за пределами свободного пространства.

Спасибо!

Тревор

1 голос
/ 09 сентября 2011

Примечание: следующее игнорирует gitolite, потому что я не знаю, как он работает.

Вместо отслеживания главной ветви каждый разработчик может отслеживать свою собственную личную ветку.Когда они хотят обновления, они могут объединить их с мастером.(Похоже, ваши текущие настройки противоположны: все отслеживают мастер и нажимают вручную.)

Кроме того, не забывайте о завершении вкладки.Для меня в Ubuntu с использованием bash, набрав git push origin o<TAB>, вы получите origin/, а затем на другой Tab отобразится список доступных веток.


Создание личных веток

Если у вашего интегратора есть репо в ~/prj:

integrator:~/prj$ git push origin master:trevor-personal
integrator:~/prj$ git push origin master:pydave-personal

Настройка репо разработчика

Каждый разработчик может клонировать, используя свою личную ветку.

trevor:~$ git clone /path/to/master/repo.git -b trevor-personal prj
pydave:~$ git clone /path/to/master/repo.git -b pydave-personal prj

Или они могут извлекать новую ветку в своем существующем клоне, которая отслеживает их личную ветку по источнику.

pydave:~/prj$ git checkout -b personal origin/pydave-personal 

В качестве альтернативы, мы можем использовать set-upstream, если мы хотим использовать существующую ветку.*

pydave:~/prj$ git branch --set-upstream personal origin/pydave-personal  

Рабочий процесс

Опубликовать изменение в ветке разработчика.

trevor:~/prj$ git commit -am'changed something'
trevor:~/prj$ git push

Объединить его.

integrator:~/prj$ git pull
integrator:~/prj$ git push origin origin/trevor-personal:master

Получить изменения из главной ветви.(Мы должны быть конкретными об использовании мастера origin. git pull просто объединит изменения в pydave-personal

pydave:~/prj$ git pull origin master
...