首页 > 解决方案 > git-receive-pack/git-upload-pack 和 git-http-backend 的区别

问题描述

为了更多地了解 git,我尝试使用 Python 和 Flask 编写一个非常简单的 Git 服务器。我注册了一个端点并将调用重定向到git-http-backend。到目前为止,一个简单的拉动工作正常。简单/小推也通过。

现在我偶然发现了git-upload-packgit-receive-pack,我想知道为什么或何时需要它们?他们git-http-backend在后台使用吗?我不确定我是否还必须支持这些命令。

PS 我试着绕着 SmartHTTP 转。是全双工的意思吗?或者 SmartHTTP vs Dumb 意味着什么?如果它也只是接收和发送/推送文件,我不完全理解什么应该是聪明的?

标签: gitgit-http-backend

解决方案


我在2011 年用 Git 1.6.6介绍了智能 http 协议

但是git-receive-packgit-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/binGit 安装的文件夹时,您会看到:

-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-packgit-upload-pack只是符号链接到git自身(!)

但是,由于它们的命名约定 ( git-xxx),它们实际上是git使用命令receive-packupload-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

推荐阅读