Я представил протокол 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