git - git-receive-pack/git-upload-pack 和 git-http-backend 的区别
问题描述
为了更多地了解 git,我尝试使用 Python 和 Flask 编写一个非常简单的 Git 服务器。我注册了一个端点并将调用重定向到git-http-backend。到目前为止,一个简单的拉动工作正常。简单/小推也通过。
现在我偶然发现了git-upload-pack和git-receive-pack,我想知道为什么或何时需要它们?他们git-http-backend
在后台使用吗?我不确定我是否还必须支持这些命令。
PS 我试着绕着 SmartHTTP 转。是全双工的意思吗?或者 SmartHTTP vs Dumb 意味着什么?如果它也只是接收和发送/推送文件,我不完全理解什么应该是聪明的?
解决方案
我在2011 年用 Git 1.6.6介绍了智能 http 协议。
但是git-receive-pack
,git-upload-pack
即使没有 HTTP,也会涉及到,例如 SSH URL。
我必须了解它们,因为我经常在我不是 root 的服务器上安装 Git。
这意味着可执行文件git
不在 中/usr/bin
,而是在/my/path/to/git/usr/bin
每当我git clone
从该服务器(或 a git ls-remote
)在我的 PC 上执行操作时,我都会得到:
bash: git-upload-pack: command not found
如果我尝试git push
从我的 PC 到该服务器:
bash: git-receive-pack: command not found
这是因为,当您查看usr/bin
Git 安装的文件夹时,您会看到:
-rwxr-xr-x. 1 <auser> <agroup> 3.0M Dec 13 2019 git*
drwxr-xr-x. 5 <auser> <agroup> 45 Jun 8 14:35 ../
drwxr-xr-x. 2 <auser> <agroup> 107 Jun 8 14:35 ./
lrwxrwxrwx. 1 <auser> <agroup> 3 Jun 8 14:35 git-receive-pack -> git*
lrwxrwxrwx. 1 <auser> <agroup> 3 Jun 8 14:35 git-upload-pack -> git*
lrwxrwxrwx. 1 <auser> <agroup> 3 Jun 8 14:35 git-upload-archive -> git*
意义git-receive-pack
和git-upload-pack
只是符号链接到git
自身(!)
但是,由于它们的命名约定 ( git-xxx
),它们实际上是git
使用命令receive-pack
或upload-pack
.
(顺便说一句,这适用git-xxx
于您的任何脚本$PATH
:然后您可以键入git xxx
,这将调用您的git-xxx
脚本)
为了使我的自定义 Git 安装正常工作,我必须实现git-xxx
包装器:
例子:
/my/path/to/git/git-receive-pack:
#!/bin/bash
source "setenv"
"/my/path/to/git/usr/bin/git" receive-pack "$@"
使用 setenv 设置正确的 PATH:
export PERLLIB=/my/path/to/git/usr/share/perl5/vendor_perl:/my/path/to/git/opt/endpoint/perl-5.22.0/share/perl5/vendor_perl
export PATH=/my/path/to/git/usr/bin:/my/path/to/git/usr/libexec/git-core:$PATH
export LD_LIBRARY_PATH=/project/${USER}/refer/pcres/current/usr/lib64
在客户端 (PC) 端,对于使用自定义 Git 安装的远程服务器,我需要添加:
git config --global remote.origin.uploadpack /my/path/to/git/git-upload-pack
git config --global remote.origin.receivepack=/my/path/to/git/git-receive-pack
推荐阅读
- javascript - Rxjs 在第一次从多个订阅发出时做一些事情
- c++ - 如何解决模板转换为int
- c# - 使用 Swashbuckle 定义意外参数
- flutter - Flutter:从 AlertBuilder 弹出,然后显示 SnackBar
- javascript - 如何在没有用户交互的情况下通过 javascript 在 HTML 页面中打开文件选择器对话框
- python - 获取python中第一次出现的字符串
- python - 当我停止运行 python 脚本时如何停止电报机器人运行?
- rust - 对函数返回的数据创建条件视图或代理
- domain-driven-design - 翻译应用程序中实体和值对象之间的区别
- sql - postgres:我可以声明功能依赖吗?