Это решение больше не копирует, чем необходимо. Для этого требуется один 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;
}
Один из способов сделать это было бы с git rev-list
. Следующее будет выводить коммит, на который указывает тег:
$ git rev-list -n 1 $TAG
Вы можете добавить его в качестве псевдонима в ~/.gitconfig
, если вы его много используете:
[alias]
tagcommit = rev-list -n 1
И затем позвоните с помощью:
$ git tagcommit $TAG
Можно использовать ниже, Это даст хеш коммита
git show -s --format=%H <tag>^{commit}
Если требуется сокращенный хеш коммита, git show -s --format=%h <tag>^{commit}
Таким образом, у меня есть множество папок релиза, где эти папки могут быть извлечены из одного из нескольких различных репозиториев, и могут быть 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
Это не показывает имена файлов, но, по крайней мере, вы получаете представление о хранилище.
cat .git/refs/tags/*
Каждый файл в этом каталоге содержит SHA коммита, указывающий на коммит.
Из списка рассылки git , вот способ получить список хэшей коммитов для тегов с автоматической разыменовкой для аннотированных тегов:
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
Если вы хотите просмотреть подробную информацию о теге 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) .....
Я также хотел бы знать правильный путь , но вы всегда можете заглянуть в:
$ cat .git/packed-refs
или:
$ cat .git/refs/tags/*
Это даст вам текущий хэш SHA1
Сокращенный хэш коммита
git show <tag> --format="%h" --> 42e646e
Хэш хита
git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
Вы также можете получить более простую для понимания картину того, где теги указывают на использование
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
Несмотря на то, что это довольно старая версия, я подумал, что хотел бы отметить интересную особенность, которую я только что нашел для перечисления тегов с коммитами:
git log --decorate=full
Он покажет ветви, которые заканчиваются / начинаются при коммите, и теги для коммитов.
Я также хотел бы знать «правильный» путь, но в то же время, вы можете сделать это:
git show mytag | head -1
Чтобы получить sha / hash коммита, на который ссылается тег (не sha тега):
git rev-list -1 <tag>
Как насчет этого:
git log -1 $TAGNAME
ИЛИ
git log -1 origin/$TAGNAME
Из Игоря Зевака :
Поскольку существует около 4 почти одинаково приемлемых, но разных ответов, я обобщу все различные способы оформления тега.
git rev-list -1 $TAG
( ответ ). git rev-list
выводит коммиты, которые приводят к $TAG
, аналогично git log
, но показывают только SHA1 коммита. -1
ограничивает вывод до коммита, на который он указывает.
git show-ref --tags
( ответ ) покажут все теги (локальные и извлеченные из удаленного) и их SHA1.
git show-ref $TAG
( ответ ) покажет тег и его путь вместе с SHA1.
git rev-parse $TAG
( ответ ) покажет SHA1 аннотированного тега.
git rev-parse --verify $TAG^{commit}
( ответ ) покажет SHA1 как аннотированных, так и аннотированных тегов. В Windows используйте git rev-parse --verify %TAG%^^^^{commit}
(четыре шляпы).
cat .git/refs/tags/*
или cat .git/packed-refs
( ответ ) в зависимости от того, является ли тег локальным или извлеченным из удаленного.
Используйте
git rev-parse --verify <tag>^{commit}
(что вернет SHA-1 коммита даже для аннотированного тега).
git show-ref <tag>
также будет работать, если <tag>
не аннотирован. И всегда есть git for-each-ref
(подробности см. В документации).
В моем репозитории git show-ref TAG
показывает хэш тега, а не хеш коммита, на который он указывает.
git show-ref --dereference TAG
показывает, кроме того, коммит, на который указывают.
Просто используйте git show <tag>
Однако, он также сбрасывает коммиты diff. Чтобы пропустить эти различия, используйте git log -1 <tag>
. (Спасибо @DolphinDream и @demisx!)
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