Search code examples
gitclone

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


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?


Solution

  • 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 .