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

The*_*hat 3 git

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

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

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

Von*_*onC 5

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

这将把Git 的分散模型(其中每个操作都是本地的和快速的)恢复为集中模式(您需要访问服务器来执行操作).

当你有完整的回购时,大多数命令(日志,差异,提交,...)都有意义.

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

没有"GIT中服务器",仅侦听(httpd的或sshd的),然后调用git-receive-packgit-upload-pack(在的情况下,智能协议).

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

(从" 重新实现"git clone"在Haskell中自下而上 ")

这就是为什么在这些侦听器之上开发API以暴露这些命令(托管服务器管理的存储库本地)的原因.


我所知道的一个替代方案是gitolite site local命令.
Gitolite是一个身份验证层(由监听器https或ssh调用,并检查用户访问repo的权限).
它可以委派一些命令在服务器上"本地"执行:

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

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

可以认为这些命令与man git-shell中的COMMAND_DIR中的命令相同.


可能的扩展:请参阅" 宣布GitTorrent:分散的GitHub "

这是从Git服务器获取除了包文件之外的其他内容的示例.

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

git clone gittorrent://github.com/cjb/recursers
Run Code Online (Sandbox Code Playgroud)

Git实际上有一个内置网络协议的可扩展机制.它的工作方式是我的git克隆线变成"运行git-remote-gittorrent命令并将URL作为参数".