How to detect whether a Git server supports shallow cloning?

Some Git servers or hosting services (apparently GitHub Enterprise) are not supporting shallow clones, instead they simply stall when a request like the following is sent:

git clone --depth 1 https://server/user/repo.git

Is there a way to detect whether the server supports shallow cloning or not? Is there a Git or CURL command that I can send to the server to find out whether it supports shallow cloning or not?

I’ve found a reference to Git Protocol Capabilities, is this what I need to look for? How can I get a hold of the server’s capabilities?

  • Github - automatically merge base branch into pull request?
  • Git track how a commit got into a branch
  • Does GitHub Enterprise support shallow cloning?
  • Git/Github workflow for students and projects
  • connect to github enterprise from egit over https with a self signed certificate
  • Github enterprise code access control
  • How do I fix git certificate errors?
  • Create a GitHub webhook for when a pull request is accepted & merged to master
  • One Solution collect form web for “How to detect whether a Git server supports shallow cloning?”

    The smart protocol does some advertisement

    ssh -x git@server "git-receive-pack 'simplegit-progit.git'"
    005bca82a6dff817ec66f4437202690a93763949 refs/heads/master report-status \
        delete-refs side-band-64k quiet ofs-delta \
        agent=git/2:2.1.1+github-607-gfba4028 delete-refs
    

    The git-receive-pack command immediately responds with one line for each reference it currently has – in this case, just the master branch and its SHA-1.
    The first line also has a list of the server’s capabilities (here, report-status, delete-refs, and some others, including the client identifier).

    The git remote helpers have options related to the shallow capability, but it is not clear they would be advertised the same way as in the ssh command above.

    git 1.6.6 updated the packfile transfer protocol, including a “Reference Discovery” section:

    When the client initially connects the server will immediately respond
    with a listing of each reference it has (all branches and tags) along
    with the object name that each reference currently points to.

    $ echo -e -n "0039git-upload-pack /schacon/gitbook.git\0host=example.com\0" |
    nc -v example.com 9418
    00887217a7c7e582c46cec22a130adf4b9d7d950fba0 HEAD\0multi_ack thin-pack
    side-band side-band-64k ofs-delta shallow no-progress include-tag
    00441d3fcd5ced445d1abc402225c0b8a1299641f497 refs/heads/integration
    003f7217a7c7e582c46cec22a130adf4b9d7d950fba0 refs/heads/master
    003cb88d2441cac0977faf98efc80305012112238d9d refs/tags/v0.9
    003c525128480b96c89e6418b1e40909bf6c5b2d580f refs/tags/v1.0
    003fe92df48743b7bc7d26bcaabfddde0a1e20cae47c refs/tags/v1.0^{}
    0000
    
    Git Baby is a git and github fan, let's start git clone.