Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is there a simple way to "git describe" a remote repository?

Tags:

git

clone

I want to execute the following command on a remote server:

git archive --prefix="$tag/" --remote="ssh://$gitserver/var/git/$repo" "$tag" | tar -xvf-

The problem is I don't know what $tag is. It should be the output of git describe --abbrev=0 on an up-to-date clone, but I don't know how to get that information without making a local clone of the repository. Is it possible to do this without making a local clone?

like image 647
kojiro Avatar asked Nov 08 '11 18:11

kojiro


People also ask

How do I view a remote git?

To view your remote branches, simply pass the -r flag to the git branch command. You can inspect remote branches with the usual git checkout and git log commands. If you approve the changes a remote branch contains, you can merge it into a local branch with a normal git merge .

How do I find my remote git repository?

The default name (also known as an alias) for that remote repo is origin. If you've copied a project from Github, it already has an origin. You can view that origin with the command git remote -v, which will list the URL of the remote repo.

How do you describe what git is?

Git is a DevOps tool used for source code management. It is a free and open-source version control system used to handle small to very large projects efficiently. Git is used to tracking changes in the source code, enabling multiple developers to work together on non-linear development.

What is remote repository in git?

A remote in Git is a common repository that all team members use to exchange their changes. In most cases, such a remote repository is stored on a code hosting service like GitHub or on an internal server. In contrast to a local repository, a remote typically does not provide a file tree of the project's current state.


2 Answers

#!/usr/bin/awk -f
BEGIN {
  FS = "[ /^]+"
  while ("git ls-remote " ARGV[1] "| sort -Vk2" | getline) {
    if (!sha)
      sha = substr($0, 1, 7)
    tag = $3
  }
  while ("curl -s " ARGV[1] "/releases/tag/" tag | getline)
    if ($3 ~ "commits")
      com = $2
  printf com ? "%s-%s-g%s\n" : "%s\n", tag, com, sha
}

Sample output

$ git-describe-remote.awk https://github.com/stedolan/jq
jq-1.4-148-g89791a0
like image 76
Zombo Avatar answered Nov 10 '22 22:11

Zombo


The only way you could start parsing for your tag, without adding too much to your local disk, would be:

  • make an empty repo
  • add the remote address of your remote repo
  • try a git fetch --dry-run

That will load the pack files of the remote repo, though.
I don't think you can just query this information without downloading something.

I have done it for a gitolite repo for instance:

VonC@NETVONC /c/prog/git
$ git init g2
Initialized empty Git repository in c:/prog/git/g2/.git/

VonC@NETVONC /c/prog/git
$ cd g2

VonC@NETVONC /c/prog/git/g2 (master)
$ git remote add origin https://github.com/sitaramc/gitolite.git

VonC@NETVONC /c/prog/git/g2 (master)
$ git fetch --dry-run
remote: Counting objects: 5114, done.
remote: Compressing objects: 100% (1919/1919), done.
remote: Total 5114 (delta 3548), reused 4664 (delta 3142)
Receiving objects: 100% (5114/5114), 1.81 MiB | 722 KiB/s, done.
Resolving deltas: 100% (3548/3548), done.
From https://github.com/sitaramc/gitolite
 * [new branch]      bp-v2.0.3  -> origin/bp-v2.0.3
 * [new branch]      fedora-temp -> origin/fedora-temp
 * [new branch]      gh-pages   -> origin/gh-pages
 * [new branch]      master     -> origin/master
 * [new branch]      pu         -> origin/pu
 * [new branch]      temp-br--data-dumper-problem-demo -> origin/temp-br--data-dumper-problem-demo
 * [new branch]      vrs        -> origin/vrs
 * [new tag]         v2.1       -> v2.1
From https://github.com/sitaramc/gitolite
 * [new tag]         v0.50      -> v0.50
 * [new tag]         v0.55      -> v0.55
[...]
 * [new tag]         v2.0rc2    -> v2.0rc2
 * [new tag]         v2.1       -> v2.1
                                   ^^^^
                                    |
                                    --- could be the tag you need

As mentioned above, the only traces are the pack files, so at least you can easily clean them once you have your information:

VonC@NETVONC /c/prog/git/g2 (master)
$ l .git/objects/pack/
total 1000
drwxr-xr-x    4 VonC     Administ        0 Nov  8 19:45 ..
-r--r--r--    1 VonC     Administ  1898987 Nov  8 19:46 pack-c70771bc8a5ecc099ed88da0c3f631f84b34fe9d.pack
-r--r--r--    1 VonC     Administ   144264 Nov  8 19:46 pack-c70771bc8a5ecc099ed88da0c3f631f84b34fe9d.idx
drwxr-xr-x    2 VonC     Administ     4096 Nov  8 19:46 .
like image 41
VonC Avatar answered Nov 10 '22 21:11

VonC