我在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