Как программно определить, является ли контроль Мерзавца тегом и если так, каково имя тега

К моему знанию Java вынуждает Вас считать файл как байты, а не способность заблокировать чтение. При сериализации объектов Java это была бы другая история.

другие примеры, показанные использование класс DataInputStream с Файлом, но можно также использовать ярлык: класс RandomAccessFile :

RandomAccessFile in = new RandomAccessFile("filename", "r");
int version = in.readInt();
byte type = in.readByte();
int beginOfData = in.readInt();
byte[] tempId;
in.read(tempId, 0, 16);
String id = new String(tempId);

Примечание, что Вы могли превратить объекты ответа в класс, если это облегчит.

46
задан Community 23 May 2017 в 10:30
поделиться

4 ответа

Решением вашего вопроса является использование

git describe --exact-match HEAD

(которое учитывает только ] аннотированные теги, но вы должны использовать аннотированные и, возможно, даже подписанные теги для маркировки выпусков).

Если вы хотите учитывать все теги, также легкие теги (которые обычно используются для локальной маркировки ), вы можете использовать - tags option:

git describe --exact-match --tags HEAD

Но я думаю, что у вас есть "

55
ответ дан 26 November 2019 в 20:34
поделиться

Лучший способ сделать это - использовать команду git describe :

git-describe - Показать самый последний тег, доступный из commit

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

5
ответ дан 26 November 2019 в 20:34
поделиться

A better solution (from Greg Hewgill's answer in the other question) would be:

git name-rev --name-only --tags HEAD

If it returns "undefined" then you are not on a tag. Otherwise it returns the tag name. So a one-liner to do something like my other answer would be:

git_tag=`git name-rev --name-only --tags HEAD | sed 's/^undefined$//'`

Interactive shell example of how it works:

$ git checkout master
Already on "master"
$ git name-rev --name-only --tags HEAD
undefined
$ git checkout some-tag
Note: moving to "some-tag" which isnt a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
  git checkout -b <new_branch_name>
HEAD is now at 1234567... Some comment blah blah
$ git name-rev --name-only --tags HEAD
some-tag
2
ответ дан 26 November 2019 в 20:34
поделиться

Вот краткий сценарий оболочки (протестирован в Bash, не подтвержден, работает ли он с пеплом и т. Д.). Он установит в переменной git_tag имя текущего извлеченного тега или оставит поле пустым, если касса не помечена.

git_tag=''
this_commit=`git log --pretty=format:%H%n HEAD^..`

for tag in `git tag -l`; do
  tag_commit=`git log --pretty=format:%H%n tags/$tag^..tags/$tag`
  if [ "$this_commit" = "$tag_commit" ]; then
    # This is a tagged commit, so use the tag.
    git_tag="$tag"
  fi
done

Комментарий Якуба Наребски :

Это решение сводится к перебиранию всех тегов и проверке, указывают ли они на соответствующий коммит, то есть на объект, на который указывает HEAD. Используя команды подключения, то есть команды, предназначенные для написания сценариев, это можно записать как:

this_commit=$(git rev-parse --verify HEAD)
git for-each-ref --format="%(*objectname) %(refname:short)" refs/tags/ |
while read tagged_object tagname
do
    if test "$this_commit" = "$tagged_object"
    then
        echo $tagname
    fi
done

Это напечатает все теги, которые указывают на текущую фиксацию.

-2
ответ дан 26 November 2019 в 20:34
поделиться