Как найти последний хэш-код git commit из ant build script

Как я могу найти последний хэш-код git commit из ant build script?

В настоящее время я работаю над новым проектом с открытым исходным кодом, который я храню на github. Я хотел бы расширить существующий файл сборки ant, чтобы я мог создавать пронумерованные сборки. Я предполагаю, что я запустил сборку с чем-то вроде "ant buildnum -Dnum = 12".

Я хочу, чтобы в полученном банке было два важных бита информации в файле манифеста:

  • build.number = 12
  • build.gitcommit =

Я знаю, как создать строку build.number. Тем не менее, я не уверен в лучшем ant сантехнике, чтобы найти последний хеш-код фиксации git, который является значением, которое я хочу заполнить для.

Ответ 1

Я написал следующий ant целевой проект для github. Использование:

  • хранит версию в свойстве "repository.version"
  • работает, если не установлен git или отсутствует каталог .git(резервный)
  • другие цели должны зависеть от этой цели, если им нужна версия git
  • выполняется только одна команда git (- всегда)

<available file=".git" type="dir" property="git.present"/>

<target name="git.revision" description="Store git revision in ${repository.version}" if="git.present">
    <exec executable="git" outputproperty="git.revision" failifexecutionfails="false" errorproperty="">
        <arg value="describe"/>
        <arg value="--tags"/>
        <arg value="--always"/>
        <arg value="HEAD"/>
    </exec>
    <condition property="repository.version" value="${git.revision}" else="unknown">
        <and>
            <isset property="git.revision"/>
            <length string="${git.revision}" trim="yes" length="0" when="greater"/>
        </and>
    </condition>
</target>

Это, например, для расширения токена @[email protected] в файле шаблона:

<target name="index.html" depends="git.revision" description="build index.html from template">
    <copy file="index.html.template" tofile="index.html" overwrite="yes">
        <filterchain>
            <replacetokens>
                <token key="repository.version" value="${repository.version}" />
            </replacetokens>
        </filterchain>
    </copy>
</target>

Ответ 2

Эта команда возвращает всегда рабочую папку last commit SHA1, полезную, когда вы не всегда строите из HEAD. Команда должна запускаться как в системах Windows, так и в системах * nix

<exec executable="git" outputproperty="git.revision">
    <arg value="log" />
    <arg value="-1" />
    <arg value="--pretty=format:%H" />
</exec>

Ответ 3

Будет ли это то, что вы ищете?

git rev-parse HEAD

Ответ 4

Я действительно использовал оба ответа. Код ant, который я написал, был следующим.

  <target name="getgitdetails" >
    <exec executable="git" outputproperty="git.tagstring">
      <arg value="describe"/>
    </exec>
    <exec executable="git" outputproperty="git.revision">
      <arg value="rev-parse"/>
      <arg value="HEAD"/>
    </exec>
    <if>
      <contains string="${git.tagstring}" substring="cannot"/>
      <then>
        <property name="git.tag" value="none"/>
      </then>
      <else>
        <property name="git.tag" value="${git.tagstring}"/>
      </else>
    </if>
  </target>

Ответ 5

Я написал задачу Ant для определения версии сборки без явного вызова команды Git, поэтому мне не нужно ее устанавливать (в Windows мне также необходимо включить ее в PATH)., Рабочий процесс версии:

  • Любые изменения версии "вехой" (т.е. первые 2 или 3 числа) устанавливаются вручную через теги на ветке master.
  • Каждая фиксация, следующая за тегом, добавляет номер сборки. (Только для тегов на master.)
  • Если вы создаете отдельный филиал, его имя должно быть включено в версию.

Исходный код и примеры: https://github.com/Hunternif/JGitVersion

Ответ 6

Вы должны пометить версию (начиная с 0,1 или аналогичного), а затем просто использовать git describe.

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

Ответ 7

В большой компании я обнаружил, что <exec> git command-line быстро столкнулся с проблемами, некоторые разработчики использовали графический интерфейс, у некоторых были разные версии командной строки, установленные в разных местах, у некоторых были другие проблемы. Я понял, что путь - это чисто Java-решение с зависимостями, входящими в систему построения проекта, как мы уже использовали ранее с Svnkit for Subversion.

Одно из условий заключалось в том, что разрешены только "основные" библиотеки. Мы могли бы использовать библиотеку JGit, но многие проекты задач git ant, разбросанные по github и т.п., Были исключены.

Решение заключалось в использовании комбинации внутри библиотеки build.xml и JGit.

TODO: вставить код...