I think a client developed using the standard git protocol would sort out the this issue.
That would revert the decentralized model of Git (where every operation is local and fast) to a centralized one (where you need to access a server to perform an operation.
Most of the commands (logs, diff, commit, ...) make sense when you have the full repo.
If the git server provides the data I want to develop a client that puts these APIs out of business.
There is no "git server", only listeners (httpd or sshd) which then call git-receive-pack
and git-upload-pack
(in case of the smart protocol).

(From "Reimplementing “git clone” in Haskell from the bottom up")
That is why an API is developed on top of those listeners, in order to expose those commands (local to the repos managed by the hosting server).
One alternative I am aware of is the gitolite site local commands.
Gitolite is an authentication layer (called by the listener https or ssh, and checking the right of a user to access a repo).
It can delegate some commands to be executed "locally" on the server:
The main purpose of gitolite is to prevent you from getting a shell. But there are commands that you often need to run on the server (i.e., cannot be done by pushing something to a repo).
To enable this, gitolite allows the admin to setup scripts in a special directory that users can then run. Gitolite comes with a set of working scripts that your admin may install, or may use as a starting point for his own, if he chooses.
Think of these commands as equivalent to those in COMMAND_DIR in man git-shell.
Possible extension: see "Announcing GitTorrent: A Decentralized GitHub "
This is an example of getting from a Git server something else than just the pack files.
Using a different protocol can make a git clone return something else than the full repo:
git clone gittorrent://github.com/cjb/recursers
Git actually has an extensible mechanism for network protocols built in. The way it works is that my git clone line gets turned into “run the git-remote-gittorrent
command and give it the URL as an argument”.