Как я могу помешать себе совершить переход в главную ветку в git? - PullRequest
1 голос
/ 09 октября 2011

Мой идеальный рабочий процесс - фиксировать изменения на dev и объединять изменения с мастером только через git merge --no-ff dev, но иногда происходит следующее:

На устройстве

dev: git add .
dev: git commit -m "Cured cancer."
dev: git checkout master
master: git merge --no-ff dev

Пишет еще код

master: git commit -a -m "Did something amazing"

Ой, только что посвятил себя хозяину. Если мне повезет, я сразу пойму это, но если нет, я смогу подтолкнуть ветку вверх по течению, добавив еще 10 изменений. Так что это заканчивается в удаленном:

Master   -------- Merge --- commit - commit --------------- Merge
Dev      \ Commit/                        \ commit - commit /

Хотя это должно выглядеть так:

Master   -------- Merge ------------- Merge --------------------- Merge
Dev      \ Commit/     \ commit commit /  \ commit - commit - commit /

Как я могу устранить человеческий фактор (т. Е. Мою глупость) и остановить себя от перехода в основную ветвь? Я на Ubuntu.

Ответы [ 3 ]

3 голосов
/ 09 октября 2011

Вы можете довольно легко написать ловушку перед фиксацией , чтобы проверить текущую ветку и отклонить фиксацию на основе имени ветви.

3 голосов
/ 09 октября 2011

Это не пуленепробиваемое решение, но вы можете установить git-complete.bash и использовать его расширение PS1 для отображения текущей ветви (и других полезных вещей) как части вашей командной строки.См. здесь для объяснения.

Это не помешает вам совершить мастеринг, но будет трудно забыть, в какой ветке вы находитесь.

1 голос
/ 21 декабря 2011

Я пытаюсь настроить что-то подобное, где только hudson фиксирует, поскольку он объединит удаленную ветвь, которую вы фиксируете, с master, а затем вставит их в наш git.сборка ... о, счастливый день.

сценарий предварительного получения (на стороне сервера - не помещать локально) ....

#!/bin/sh
# <oldrev> <newrev> <refname>
# update a blame tree
while read oldrev newrev ref
do
    echo "STARTING [$oldrev $newrev $ref]"

if [ $ref == "refs/heads/master" ] && [ $USER != "hudson" ]
then
    echo "YOU CANNOT COMMIT STUFF TO MASTER BRANCH"
    echo "TO CORRECT THIS run"
    echo "git branch -c <branch name> then run"
    echo "git push <reponame> <branch name>"
    echo "and hudson will take and push to master IF it passes the tests"
    exit 1;
else
    echo "This is hudson, allowing commit to master"
fi

done

и затем, конечно, я ненавижу опроспоэтому после получения я делаю что-то вроде этого (учтите, что пользователь hudson не может запустить команду curl или вы попадаете в бесконечный цикл, поскольку он продолжает посылать изменения, вносимые в основную ветвь) ...Сценарий получения (на стороне сервера - не размещать локально)

echo "User=$USER"

if [ "hudson" != $USER ]
then
    echo "Notifying hudson to build NOW"
    curl http://10.222.0.168:8080/job/stserver1/build?delay=0sec
    echo "Done notifying"
else
    echo "This is hudson, not triggering build now"
fi

ПРИМЕЧАНИЕ: Я пока не нашел способ для разработчика вернуть свой коммит мастеру :(. все еще работаю над этим.

...