Ответ 1
Я создал плагин Maven именно для этой цели, который действительно соответствует моим потребностям (на самом деле он теперь их превосходит).
Он называется Mavanagaiata, с открытым исходным кодом и доступен из Maven Central.
В настоящее время я использую коллекцию из трех команд для получения текущего тега, ветки и даты и SHA1 последней фиксации.
git describe --always --tag
git log -1 --format="%H%n%aD"
git rev-parse --abbrev-ref HEAD
Что выведет что-то вроде:
1.2.3-5-gdeadbeef
deadbeef3b8d90071c24f51ac8f26ce97a72727b
Wed, 19 May 2010 09:12:34 +0200
master
Честно говоря, я в полном порядке с этим. Но я использую эти команды от Maven и всех, кто раньше использовал Maven, знает, как много таких вещей, как внешние команды, раздувают POM. Я просто хочу уменьшить размер pom.xml и немного сократить время выполнения.
Я создал плагин Maven именно для этой цели, который действительно соответствует моим потребностям (на самом деле он теперь их превосходит).
Он называется Mavanagaiata, с открытым исходным кодом и доступен из Maven Central.
git log
чрезвычайно гибкий, с множеством опций. Возможно, вы не сможете воспроизвести точный вывод трех приведенных выше команд, но вы можете подойти достаточно близко, чтобы добиться необходимого эффекта.
Например:
git log --pretty=format:'%ad %h %d' --abbrev-commit --date=short -1
выдает дату, SHA-1 и символические ссылки (включая теги) последнего (HEAD) commit:
2010-05-20 45bd5e7 (HEAD, origin/master)
После чего, предположительно, sed
и/или awk
или, возможно, методы Maven-native могут выполнять тонкую настройку/полировку. Обратите внимание, что конкретный тег связан с конкретным коммитом, поэтому, если он был за три месяца до HEAD, который был помечен, например, "v1.0.0", вы не увидите "v1.0.0", выше.
Простейшая одиночная команда для предоставления сукцинта описания коммита:
git describe
который выписывает последний применимый тег, количество коммитов с момента помеченного фиксации и SHA1:
v3.3.0-46-g71a77dc
Я не совсем знаком с Maven и не знаю, как легко/сложно запускать внешние процессы, поэтому я не уверен, что любая из следующих действий в любом случае, но я думал, что могу упомянуть об этом на всякий случай.
Для конкретной цели, которую вы описываете, т.е. создания тегов, в системе autoconf/automake, я фактически использую что-то вроде:
BUILDTAG="`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`"
который создает что-то подходящее для привязки к концу пути программы:
мастер-c5282ff
Более подробное описание, подходящее для включения в качестве комментария или печатного идентификатора:
BUILDDESC="$(git symbolic-ref HEAD 2> /dev/null | cut -b 12-)-$(git log --pretty=format:'%h, %ad' -1)"
создает что-то вроде:
master-c5282ff, пт 12 мар 22:19:51 2010 -0600
Я думаю, что игра с git log
, возможно, в сочетании с инструментами/методами обработки текста доставит вам то, что вы хотите.
Я не использую Maven, поэтому я не знаю, как вы вызываете эти команды, но добавление пользовательских команд в git довольно тривиально.
Создайте script, называемый git -tbc, который выглядит так:
#!/bin/bash
git describe --always --tag
git log -1 --format="%H%n%aD"
git rev-parse --abbrev-ref HEAD
Убедитесь, что git -tbc находится в вашей PATH, теперь вы можете вызвать "git tbc". Это то, что вы искали?
Мое "репо" для таких вещей всегда bash_completion. Итак, вкладка вкладки - это способ, которым bash становится продуктивным инструментом, поэтому, откуда берутся все магические вещи?
существует каталог /etc/bash_completion.d/, где остаются расширения для завершения bash. должен быть исполняемый файл git, открыть его и искать что-то вроде get_refs(). Если вы дадите ему чек, вы обнаружите, что git описать и git for-each-ref - ваши друзья, попробуйте несколько примеров:
Общее репо:
$ cd /your/git/repo; git branch -a
master
blaster
* brunch
lunch
remotes/origin/master
remotes/origin/develop
remotes/github/master
Какова моя отмеченная ветка?
$ git describe --contains --all HEAD
brunch
Каковы мои пульты?
$ git remote
origin
github
Каковы ветки на пультах?
$ git for-each-ref --format="%(refname:short)" refs/remotes
origin/master
origin/develop
github/master
Каковы мои локальные ветки?
$ git branch
master
blaster
* brunch
lunch
... выводится более синтаксический вывод?
$ git for-each-ref --format="%(refname:short)" refs/heads
master
blaster
brunch
lunch
Как насчет тегов?
$ git for-each-ref --format="%(refname:short)" refs/heads refs/remotes refs/tags
master
blaster
brunch
lunch
origin/master
origin/develop
github/master
release-0_1
release-0_2
release-1_0
проверьте "man-страницы" для этих команд, там намного больше!!
Я нашел этот плагин Maven: https://github.com/alx3apps/jgit-buildnumber, который кажется хорошим заменой для buildnumber-maven- плагин для git проектов. Кроме того, он доступен из центральных хранилищ Maven.
Он отлично работает в Maven 3. Для многомодульных проектов Maven 2 просто добавьте следующую строку в раздел свойств вашего родительского pom:
<session.executionRootDirectory>${basedir}</session.executionRootDirectory>
Здесь отображается идентификатор фиксации HEAD, а также любые ветки или теги, которые также находятся в HEAD.
git reflog --decorate -1
Пример вывода:
484c27b (HEAD, tag: deployment-2014-07-30-2359, master, origin/master) [email protected]{0}: 484c27b878ca5ab45185267f4a6b56f8f8d39892: updating HEAD