为什么各种git命令只在本地可用?

时间:2015-05-31 14:58:43

标签: git

使用标准客户端再次运行远程存储库的命令数量非常有限 大多数远程命令由git-ls-remote提供。这只是git客户端的限制,还是git服务器的限制?

我想编写一个客户端,它提供了大部分可以在本地运行的命令,也可以在远程存储库上运行。

这样做的一个好例子是获取日志(即git log)因此问题的原因。  目前的做法是使用由托管git repostiory(github,gitlab,gerrit,bitbucket,stash等)的任何服务开发的专有API,因此我认为使用标准git协议开发的客户端将解决此问题。

1 个答案:

答案 0 :(得分:5)

  

我认为使用标准git协议开发的客户端会解决这个问题。

这会将Git的分散式模型(其中每个操作都是本地的,快速)还原为集中式(您需要的地方)访问服务器以执行操作。

当你拥有完整的回购时,大多数命令(logs,diff,commit,...)都有意义。

  

如果git服务器提供了我想要开发客户端的数据,这些客户端会将这些API停止运营。

没有“git服务器”,只有侦听器(httpd或sshd)然后调用git-receive-packgit-upload-pack(如果是smart protocol)。

http://stefan.saasen.me/articles/git-clone-in-haskell-from-the-bottom-up/images/pack-client-server.png

(来自“Reimplementing “git clone” in Haskell from the bottom up”)

这就是为什么在这些侦听器之上开发API,以便将这些命令( local )暴露给托管服务器管理的repos。

我所知道的另一个选择是gitolite site local commands Gitolite是一个身份验证层(由侦听器https或ssh调用,并检查用户访问存储库的权限)。
它可以委派一些命令在服务器上“本地”执行:

  

gitolite的主要目的是防止你获得一个shell。但是有些命令经常需要在服务器上运行(即无法通过将某些内容推送到回购服务器来完成)。

     

要启用此功能,gitolite允许管理员在用户可以运行的特殊目录中设置脚本。 Gitolite附带了一组管理员可以安装的工作脚本,或者如果他选择的话,可以作为他自己的起点。

     

将这些命令视为与man git-shell中的COMMAND_DIR中的命令等效。

可能的扩展程序:请参阅“Announcing GitTorrent: A Decentralized GitHub

这是从Git服务器获取除了包文件以外的其他内容的一个例子。

使用不同的协议可以使git clone返回除完整repo之外的其他内容:

git clone gittorrent://github.com/cjb/recursers
  

Git实际上有一个内置网络协议的可扩展机制。它的工作方式是我的git克隆线转为“运行 git-remote-gittorrent 命令并将其作为URL争论“。