Различия между git -receive-pack / git -upload-pack и git -http-backend - PullRequest
1 голос
/ 28 мая 2020

Чтобы понять больше о git, я пытаюсь написать очень простой Git сервер, используя Python и Flask. Я зарегистрировал конечную точку и перенаправлял вызовы на git -http-backend . Пока что простая тяга работает нормально. Также простые / маленькие толчки go через.

Теперь я споткнулся о git -upload-pack и git -receive-pack , и я Интересно, зачем и когда они мне понадобятся? Используются ли они git-http-backend в фоновом режиме? Я не уверен, что мне нужно дополнительно поддерживать и эти команды.

PS Я пытаюсь осмыслить SmartHTTP. Означает ли это полный дуплекс? Или что означает SmartHTTP vs Dumb? Я не совсем понимаю, что должно быть умным, если он просто получает и отправляет / отправляет файл?

1 Ответ

3 голосов
/ 13 июня 2020

Я представил протокол smart http в 2011 с Git 1.6.6 .

Но git-receive-pack и git-upload-pack будет задействовано даже без HTTP, например, с URL-адресом S SH.

Я должен знать о них, потому что я часто устанавливаю Git на серверах, где я не root.
Это означает, что исполняемый файл git находится не в /usr/bin, а в /my/path/to/git/usr/bin

И всякий раз, когда я делаю git clone на своем P C с этого сервера (или git ls-remote), я получаю:

bash: git-upload-pack: command not found

Если я попробую git push с моего P C на этот сервер:

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 правильного ПУТЬ:

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

И на стороне клиента (P C) мне нужно для удаленного использования сервера с пользовательской установкой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...