Как узнать, на какой коммит указывает тег в Git?

Это решение больше не копирует, чем необходимо. Для этого требуется один strlen, поэтому, если поиск имени каталога может вернуть количество копируемых байтов или если вы можете предварительно вычислить длину родительской строки, вы можете оптимизировать это.

void GetFilename(char *pFile)
{
    strcpy(pFile, "someFile");
}

void GetParentDir(char *pDir)
{
    strcpy(pDir, "/parentdir");
}

int _tmain(int argc, _TCHAR* argv[])
{

    char path[1024];
    GetParentDir(path);
    int dirSize = strlen(path);
    path[dirSize] = '/';
    GetFilename(path + dirSize + 1);
    printf(path);
    return 0;
}
368
задан Stevoisiak 14 March 2018 в 17:43
поделиться

18 ответов

Один из способов сделать это было бы с git rev-list. Следующее будет выводить коммит, на который указывает тег:

$ git rev-list -n 1 $TAG

Вы можете добавить его в качестве псевдонима в ~/.gitconfig, если вы его много используете:

[alias]
  tagcommit = rev-list -n 1

И затем позвоните с помощью:

$ git tagcommit $TAG
298
ответ дан mipadi 14 March 2018 в 17:43
поделиться

Можно использовать ниже, Это даст хеш коммита
git show -s --format=%H <tag>^{commit}

Если требуется сокращенный хеш коммита, git show -s --format=%h <tag>^{commit}

0
ответ дан Reddysekhar Gaduputi 14 March 2018 в 17:43
поделиться

Таким образом, у меня есть множество папок релиза, где эти папки могут быть извлечены из одного из нескольких различных репозиториев, и могут быть dev, qa или основными ветками или могут быть производственными выпусками, извлеченными из тега, и тег может быть аннотирован или нет. У меня есть скрипт, который будет смотреть на целевую папку и получать ответ в форме -. Проблема в том, что разные версии git возвращают разные статусы для проверки тегов.

Итак, я обнаружил, что git show-ref --tags работал изначально, за исключением аннотированных тегов. Однако добавление -d добавило отдельную запись в список тегов, один для тега, другой для аннотации (коммит аннотации был идентифицирован как ^ {}, который я удалил с помощью sed).

Так что это ядро ​​моего сценария, для всех, кто этого хочет: -

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi
0
ответ дан sibaz 14 March 2018 в 17:43
поделиться

Это не показывает имена файлов, но, по крайней мере, вы получаете представление о хранилище.

cat .git/refs/tags/*

Каждый файл в этом каталоге содержит SHA коммита, указывающий на коммит.

1
ответ дан Peter Stuifzand 14 March 2018 в 17:43
поделиться

Из списка рассылки git , вот способ получить список хэшей коммитов для тегов с автоматической разыменовкой для аннотированных тегов:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
2
ответ дан anatoly techtonik 14 March 2018 в 17:43
поделиться

Если вы хотите просмотреть подробную информацию о теге SOMETAG (тэггер, дата и т. Д.), Хеш коммита, на который он указывает, и немного информации о коммите, но без полной разницы, попробуйте

git show --name-status SOMETAG

Пример вывода:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....
2
ответ дан Avy Sharell 14 March 2018 в 17:43
поделиться

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

$ cat .git/packed-refs 

или:

$ cat .git/refs/tags/*
2
ответ дан miku 14 March 2018 в 17:43
поделиться

Это даст вам текущий хэш SHA1

Сокращенный хэш коммита

git show <tag> --format="%h" --> 42e646e

Хэш хита

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
3
ответ дан Louis 14 March 2018 в 17:43
поделиться

Вы также можете получить более простую для понимания картину того, где теги указывают на использование

git log --graph |git name-rev --stdin --tags |less

, а затем прокрутить до нужного тега с помощью /.

Более компактный вид (--pretty=oneline) плюс все головки (-a) также могут помочь:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

Выглядит немного пугающе, но в случае необходимости может также иметь псевдоним в ~/.gitconfig.

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
4
ответ дан Antony Hatchkins 14 March 2018 в 17:43
поделиться

Несмотря на то, что это довольно старая версия, я подумал, что хотел бы отметить интересную особенность, которую я только что нашел для перечисления тегов с коммитами:

git log --decorate=full

Он покажет ветви, которые заканчиваются / начинаются при коммите, и теги для коммитов.

7
ответ дан Terrence Reilly 14 March 2018 в 17:43
поделиться

Я также хотел бы знать «правильный» путь, но в то же время, вы можете сделать это:

git show mytag | head -1    
7
ответ дан gahooa 14 March 2018 в 17:43
поделиться

Чтобы получить sha / hash коммита, на который ссылается тег (не sha тега):

git rev-list -1 <tag>

10
ответ дан Daniel Little 14 March 2018 в 17:43
поделиться

Как насчет этого:

git log -1 $TAGNAME

ИЛИ

git log -1 origin/$TAGNAME
15
ответ дан ScottJShea 14 March 2018 в 17:43
поделиться

Из Игоря Зевака :

Резюме

Поскольку существует около 4 почти одинаково приемлемых, но разных ответов, я обобщу все различные способы оформления тега.

  1. git rev-list -1 $TAG ( ответ ). git rev-list выводит коммиты, которые приводят к $TAG, аналогично git log, но показывают только SHA1 коммита. -1 ограничивает вывод до коммита, на который он указывает.

  2. git show-ref --tags ( ответ ) покажут все теги (локальные и извлеченные из удаленного) и их SHA1.

  3. git show-ref $TAG ( ответ ) покажет тег и его путь вместе с SHA1.

  4. git rev-parse $TAG ( ответ ) покажет SHA1 аннотированного тега.

  5. git rev-parse --verify $TAG^{commit} ( ответ ) покажет SHA1 как аннотированных, так и аннотированных тегов. В Windows используйте git rev-parse --verify %TAG%^^^^{commit} (четыре шляпы).

  6. cat .git/refs/tags/* или cat .git/packed-refs ( ответ ) в зависимости от того, является ли тег локальным или извлеченным из удаленного.

32
ответ дан 3 revs, 2 users 80%user456814 14 March 2018 в 17:43
поделиться

Используйте

git rev-parse --verify <tag>^{commit}

(что вернет SHA-1 коммита даже для аннотированного тега).


git show-ref <tag> также будет работать, если <tag> не аннотирован. И всегда есть git for-each-ref (подробности см. В документации).

33
ответ дан Jakub Narębski 14 March 2018 в 17:43
поделиться

В моем репозитории git show-ref TAG показывает хэш тега, а не хеш коммита, на который он указывает.

git show-ref --dereference TAG показывает, кроме того, коммит, на который указывают.

37
ответ дан orip 14 March 2018 в 17:43
поделиться

Просто используйте git show <tag>

Однако, он также сбрасывает коммиты diff. Чтобы пропустить эти различия, используйте git log -1 <tag>. (Спасибо @DolphinDream и @demisx!)

94
ответ дан Hlung 14 March 2018 в 17:43
поделиться
git show-ref --tags

Например, git show-ref --abbrev=7 --tags покажет вам что-то вроде следующего:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2
216
ответ дан Roger Lipscombe 14 March 2018 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: