PROBLEM
A typical way to get a list of tags from a repository is to clone it before running git tag
:-
git clone git@ssh.dev.azure.com:v3/test/my-shitty-repo cd my-shitty-repo git -c 'versionsort.suffix=-' tag --sort='v:refname' # output 1.0.0-b20200317174203 1.0.0 1.0.1-b20200318174753 1.0.1-b20200318174841 1.0.1-b20200407185909 1.0.1 1.0.2-b20200413205910 1.0.2
versionsort.suffix=-
ensures 1.0.0-XXXXXX
comes after 1.0.0
.
To retrieve the latest tag:-
git clone git@ssh.dev.azure.com:v3/test/my-shitty-repo cd my-shitty-repo git -c 'versionsort.suffix=-' tag --sort='v:refname' | tail -n1 # output 1.0.2
While it works, it requires us to clone the repository first, and if we want to retrieve tags from multiple repositories, we are quickly filling our hard drive space.
SOLUTION
Git has a way to perform a remote query through git ls-remote
.
To perform the same task without cloning the repository, we can run this:-
git -c 'versionsort.suffix=-' ls-remote \ --tags \ --sort='v:refname' \ git@ssh.dev.azure.com:v3/test/my-shitty-repo # output b90df3d12413db22d051db1f7c7286cdd2f00b66 refs/tags/1.0.0-b20200317174203 e355a58829a2d2895ab2d7610fad1ab26dc0c1e7 refs/tags/1.0.0 345153c39a588a6ab2782772ee9dcf9f9123efa9 refs/tags/1.0.1-b20200318174753 efc40f0bd68bb8c7920be7700cab81db0e6bdf83 refs/tags/1.0.1-b20200318174841 efc40f0bd68bb8c7920be7700cab81db0e6bdf83 refs/tags/1.0.1-b20200407185909 c5ed5fe30cba621f40daa542c0613fa2c1c1a47d refs/tags/1.0.1 7205ada5d8bd4318f82e58e8752ba651211f9d82 refs/tags/1.0.2-b20200413205910 6ba62a0f06f831812cbb13a6d1e83602ffe9e8d3 refs/tags/1.0.2
To retrieve the latest tag:-
git -c 'versionsort.suffix=-' ls-remote \ --tags \ --sort='v:refname' \ git@ssh.dev.azure.com:v3/test/my-shitty-repo | tail -n1 | sed -E 's|.*refs/tags/(.+)|\1|' # output 1.0.2