обзор: в нашей компании мы пытаемся ввести политику, чтобы разработчик не мог запушить 5 и более коммитов за один раз. например: если есть 20 коммитов, которые необходимо отправить в восходящий поток. проверка не должна разрешать это с сообщением, что разрешено отправлять только 5 или менее коммитов за раз. Я пытаюсь сделать следующее, чтобы получить количество коммитов на моем локальном мастере и восходящем мастере.
git log --oneline origin/master ^master | wc -l
но это не дает мне ожидаемого результата.
origin/master ^master
— это полная форма master..origin/master
; вы хотели origin/master..master
, чья длинная форма master ^origin/master
(или вы можете написать это как ^origin/master master
, чтобы увидеть, где ^
или символ оператора отрицания идет по отношению к форме с двумя точками).
В любом случае, как только вы правильно поймете синтаксис, используйте здесь git rev-list --count
, а не git log --oneline ... | wc -l
. Однако, как сказал @jordanm (который имеет множество голосов), эта политика, вероятно, не очень хорошая идея.
Хостинг-сервис Gerrit имеет такое ограничение, что за один пуш можно отправить максимум 20 коммитов на проверку. Если их больше 20, пользователю нужно отправлять их партиями. Я не знаю, зачем вам такая политика, и я думаю, что политика Геррита больше касается производительности.
Чтобы подсчитать количество новых коммитов, которые мы сделали с точки форка, которая обычно находится на ветке удаленного отслеживания (предположим, что это origin/foo
), мы можем использовать
git rev-list --count origin/foo..HEAD
или если мы знаем два коммита
git rev-list --count commit1..commit2
Чтобы реализовать вашу политику, я бы написал хук на стороне сервера, например pre-receive
. В хуке подсчитайте количество новых коммитов и отклоните отправку, если число больше 4.
#!/bin/bash
while read oldvalue newvalue refname;do
# todo, case 0, deal with refs other than branches
# todo, case 1, create a branch
# todo, case 2, delete a branch
# case3, update a branch
count=$(git rev-list --count ${oldvalue}..${newvalue})
if [[ "${count}" -ge 5 ]];then
echo some message
exit 1
fi
done
Хотя этот ответ довольно интересен и, кажется, решает то, о чем спрашивал ОП, но какой смысл тратить время на решение чего-то, что действительно звучит как проблема X / Y?
Эта политика кажется бессмысленной и, вероятно, представляет собой проблему xy.