Я делаю dev на моем mac, но у меня есть виртуальная машина Windows, в которой я запускаю некоторые сборки. Это довольно просто. У меня Дженкинс тянет и строит приложение ежедневно.
В этом скрипте есть некоторые метаданные, которые мне нужно получить. Мне нужно получить список ветвей на сервере git, и если он имеет (поскольку ветка может не совершать), то последние метаданные коммита. В частности, отправители электронной почты.
В общем, на моем mac это было что-то простое:
git branch --all > branches
for b in $(cat branches);
do
git checkout $b
git log --name-status HEAD^..HEAD | grep Author | cut -d"<" -f2 | cut -d">" -f1 > email
echo $b > branch
python buildScript.py $(cat email) $(cat branch)
; done
rm email branch
mv branches old_branches
Я заметил, что проблема:
git log --name-status
показывает фиксации, но HEAD ^.. HEAD не возвращал результатов.Я могу найти grep и сократить альтернативы.
может кто-нибудь объяснить, почему коммиты не появятся в Windows? Есть ли встроенная в Python утилита, которая может обрабатывать все это? У меня нет проблем с запуском прямого bash, но я думаю, что python может быть более чистым, так как я уже запускаю скрипт python для сборки...
Изменить. Мое конечное состояние - это скрипт bash (или скрипт python), который будет делать следующее:
loop over all branches.
if branch is new since the last time the script was run, and has at least 1 commit
run_a_python_script with the committers email and that branch.
else if there were deleted branches since the last time it was run:
run_another_python_script with the branch
else
nothing happens because this script already ran once.
У меня этот набор на 10-минутном интервале cron.
Это легко сделать в Python OR Bash.
Вот общий рецепт, реализуемый в Python через subprocess.Popen
или в sh/bash очевидным образом.
loop over all branches
Используйте git for-each-ref
. Если вы находитесь на сервере с веткими, это git for-each-ref refs/heads
; если вы находитесь на клиенте, который имеет ветки, переименованные в имена удаленных отслеживаний (origin/master
и т.д.), это git for-each-ref refs/remotes/origin
. Используйте директивы форматирования for-each-ref
для получения соответствующего короткого имени, если хотите (но обратите внимание на шестиэтапный процесс поиска в документации gitrevisions и убедитесь, что краткое имя будет искать соответствующий хеш- файл, как правило, более умный в сценариях чтобы сохранить полное имя как можно дольше, передавая его дополнительным скриптам, которые аналогичным образом понимают этот шаблон, чтобы вы не обнаружили хеш фиксации для тега с именем xyz
когда есть ветвь с именем xyz
).
(Если вы используете библиотеку Python, у нее, вероятно, есть итератор по ссылкам, который работает аналогично git for-each-ref
.)
if branch is new since the last time the script was run, and has at least 1 commit
По определению ветвь Git не может существовать, не имея хотя бы одной фиксации на ней. Причина в том, что имя ветки - это просто имя для одного (1) кода хеширования commit.
Конечно, "новый с момента последнего запуска" требует какой-то памяти.
run_a_python_script with the committers email and that branch.
Учитывая ссылочное имя $ref
, чтобы найти электронное письмо для автора (это то, что вы делаете в исходном коде):
git log --no-walk --pretty=format:%ae $ref
Чтобы найти электронную почту для примечания коммиттера, каждая фиксация имеет отдельный "автор" и "коммиттер", хотя в большинстве случаев они обычно одинаковы - используйте %ce
вместо %ae
.
Если ссылка имеет форму refs/heads/name
, ветвь имеет имя name
; если он имеет форму refs/remotes/origin/name
, ветка имеет имя name
. Формат %(refname:short)
в git for-each-ref
будет %(refname:short)
git for-each-ref
refs/heads/
или refs/remotes/
part, но, как отмечалось ранее, это может быть неразумно делать слишком рано. Если скрипт Python может обрабатывать полное имя ссылки, это было бы лучше.
else if there were deleted branches since the last time it was run:
Это также требует памяти и некоторого способа выполнения вычитания (сохраненный набор ссылок минус текущий набор ссылок равен удаленной установке). Память в сценариях оболочки означает внешний файл; памяти в коде Python также может быть внешний файл, используя pickle
или JSon форматирования или любой другой.
run_another_python_script with the branch else nothing happens because this script already ran once.
^
специальный символа есть (Google поиск предполагает , что это приводит следующий символ путь\
делает в ш / Баше) , так чтоHEAD^..HEAD
результаты в Git видящегоHEAD..HEAD
, Хотя есть лучший способ сделать все это.