Как я могу запретить пользователям слияние начала /X в Y в git?

Можно ли заставить git объединять удаленные ветви отслеживания в соответствующую локальную ветвь? Например. предположим, что происхождение /X треков X по происхождению и соответствует местному X, и то же самое для начала /Y и Y. Я хочу, чтобы пользователи не выполняли git checkout Y; git merge origin/X. Является ли это возможным? Как?

Изменить:

Чтобы было ясно: рабочий процесс не является проблемой. Люди пытаются объединить неправильные ветви, потому что они забывают проверить правильную ветвь перед слиянием. Речь идет не о «правонарушителях» или о том, чтобы перейти к центральному репо. Просто люди забывают, в какой ветви они находятся. Последний «инцидент» был буквально:

  

«Я должен совершить и надавить на него быстро, прежде чем уйти.

     

git add.
  git commit -am 'Feature Y'
  git push origin

     

Упс, что это. Он говорит мне сначала объединить начало ветки /X. Хорошо.

     

git слияние начала /X

     

Упс, что это сейчас. Много конфликтов слияния. Что я сделал. Я лучше позвоню кому-нибудь ... "

Пользователь работал в ветке Y и не понимал, что говорит git push origin. Он сказал, что происхождение /Х необходимо слияние, и именно это он и сделал, потому что он хотел «быстро надавить». В случае, указанном выше, ветвь X была одной фиксацией перед локальным X, поэтому нажатие всех ветвей дало ошибку «слияния потребностей».

Я скорректировал «рабочий процесс», чтобы всегда явно нажимать ветвь, например. git push origin Y вместо git push origin, но это не излечивая проблему. Он должен (обычно) не допускаться без предупреждения для объединения источника /X с Y. Для объединения ветвей функций X и Y можно объединить.

6 голосов | спросил EricSchaefer 7 PM00000070000000331 2012, 19:09:03

3 ответа


3

По мере распространения git невозможно запретить пользователям делать это локально, и я даже не уверен, что это возможно с локальными перехватами.

И поскольку пользователю не нужно вытолкнуть все локальные ссылки, на нем не будет возможности предотвратить его.

Edit:

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

ответил Ikke 7 PM00000070000000531 2012, 19:59:05
1

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

Почему слияние origin/X в Y проблема? Если это связано с тем, что Y является ветвью release (которая отслеживает origin/Y), а origin/X - это разработка , и вы не запускаете код разработки в производственную версию, тогда более важно контролировать origin/Y, чем управлять ---- +: = 6 =:. + ----

Как предлагает Кристофер в комментарии, на самом деле это должно позаботиться о вашем рабочем процессе.

Чтобы предотвратить ошибки, поскольку указывает Ikke , вы можете использовать разрешения для ограничения того, кто может обновлять различные удаленные ссылки. Например, Y позволяет очень мелкозернистый контроль доступа. От Скотта Чакона отличный Pro Git :

  

Gitolite позволяет вам указывать разрешения не только репозиторием, но также именами ветвей или тегов в каждом репозитории. То есть вы можете указать, что определенные люди (или группы людей) могут только нажимать определенные «refs» (ветви или теги), но не другие.

Один из вариантов заключается в том, чтобы позволить вашему серверу непрерывной интеграции входить в ваши ветви выпуска, а только после того, как прошли интеграционные и модульные тесты. Такой автоматизированный рабочий процесс может действительно помочь предотвратить распространение ошибок.

ответил Mark Booth 8 PM00000060000004631 2012, 18:44:46
1

Один из способов - дать им альтернативные команды. Я редко использую git merge; вместо этого я использую функции bash ниже. Если вы работаете в Windows (и не используете Cygwin), я полагаю, вы могли бы создавать пакетные файлы, чтобы сделать то же самое.


function branch
{ 
    if [ $# == 0 ] ; then
        git branch | grep '^\*' | sed -e 's/.* //' ;
    elif git branch | grep -q " $1\$" ; then
        git checkout $1
    else
        git checkout master
        git checkout -b $1
    fi ;
}

function push
{
    src=`branch`
    if [ $# == 0 ] ; then
        git push origin ${src} ;
    elif [ $# == 1 ] ; then
        git push $1 ${src} ;
    else
        git push $1 ${src}:${2} ;
    fi ;
}

function pull
{
    if [ $# == 0 ] ; then
        src=`branch` ;
        git pull origin ${src} ;
    elif [ $# == 1 ] ; then
        branch $1
        git pull origin $1 ;
    else
        echo "usage: pull [BRANCH]" ;
    fi ;
}
ответил kdgregory 8 PM00000090000001131 2012, 21:56:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132