使用标准客户端再次运行远程存储库的命令数量非常有限
大多数远程命令由git-ls-remote
提供。这只是git客户端的限制,还是git服务器的限制?
我想编写一个客户端,它提供了大部分可以在本地运行的命令,也可以在远程存储库上运行。
这样做的一个好例子是获取日志(即git log
)因此问题的原因。
目前的做法是使用由托管git repostiory(github,gitlab,gerrit,bitbucket,stash等)的任何服务开发的专有API,因此我认为使用标准git协议开发的客户端将解决此问题。
答案 0 :(得分:5)
我认为使用标准git协议开发的客户端会解决这个问题。
这会将Git的分散式模型(其中每个操作都是本地的,快速)还原为集中式(您需要的地方)访问服务器以执行操作。
当你拥有完整的回购时,大多数命令(logs,diff,commit,...)都有意义。
如果git服务器提供了我想要开发客户端的数据,这些客户端会将这些API停止运营。
没有“git服务器”,只有侦听器(httpd或sshd)然后调用git-receive-pack
和git-upload-pack
(如果是smart protocol)。
(来自“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争论“。