git-upload-pack:克隆远程 Git 存储库时找不到命令
Posted
技术标签:
【中文标题】git-upload-pack:克隆远程 Git 存储库时找不到命令【英文标题】:git-upload-pack: command not found, when cloning remote Git repo 【发布时间】:2010-09-18 12:36:32 【问题描述】:我一直在使用 git 来同步我的项目的两个副本,一个是我的本地机器,另一个是测试服务器。 这是我使用 ssh 登录远程开发服务器时出现的问题;
git clone me@me.mydevbox.com:/home/chris/myproject
Initialized empty Git repository in /tmp/myproject/.git/
Password:
bash: git-upload-pack: command not found
fatal: The remote end hung up unexpectedly
fetch-pack from 'me@me.mydevbox.com:/home/chris/myproject' failed.
(文件名已更改以保护有罪的人......!)
两个盒子都运行 Solaris 10 AMD。我已经做了一些挖掘,如果我添加--upload-pack=$(which git-upload-pack)
命令有效,(并证明$PATH
根据RTFM 解决方案包含'git-upload-pack' 的路径)但这真的很烦人,加上'git push ' 不起作用,因为我认为没有 --unpack=
选项。
顺便说一句,所有 git 命令在我的本地机器上都可以正常工作,它是相同版本的软件 (1.5.4.2),安装在同一 NFS 挂载 /usr/local/bin
。
有人可以帮忙吗?
【问题讨论】:
另请参阅 ***.com/questions/1509246/… ,以了解您想要使用远程计算机上未安装git
的远程存储库的情况
【参考方案1】:
这可能就像在远程主机上安装 git 一样简单(就像我的情况一样)。
sudo apt-get install git
或其他包管理系统的等效项。
【讨论】:
【参考方案2】:我的案例是在 Win 10 上使用 GIT bash 并且我在标准位置下没有 GIT。相反,我在 /app/local/bin 下有 git。 我使用了@Garrett提供的命令,但需要更改路径以双/开头:
git config remote.origin.uploadpack //path/to/git-upload-pack
git config remote.origin.receivepack //path/to/git-receive-pack
否则 GIT 会在前面添加你的 Windows GIT 路径。
【讨论】:
【参考方案3】:将git-upload-pack
的位置添加到远程 git 用户的 .bashrc 文件中。
【讨论】:
【参考方案4】:在Brian's answer 的基础上,可以通过在克隆后运行以下命令来永久设置上传包路径,这样就无需在后续的拉取/获取请求中使用--upload-pack
。同样,设置 receive-pack 消除了对推送请求的 --receive-pack
的需要。
git config remote.origin.uploadpack /path/to/git-upload-pack
git config remote.origin.receivepack /path/to/git-receive-pack
这两个命令相当于将以下行添加到 repo 的.git/config
。
[remote "origin"]
uploadpack = /path/to/git-upload-pack
receivepack = /path/to/git-receive-pack
clone -u
的频繁用户可能对以下别名感兴趣。 myclone 应该是不言自明的。 myfetch/mypull/mypush 可用于配置未按上述修改的 repos,方法是将 git push
替换为 git mypush
,依此类推。
[alias]
myclone = clone --upload-pack /path/to/git-upload-pack
myfetch = fetch --upload-pack /path/to/git-upload-pack
mypull = pull --upload-pack /path/to/git-upload-pack
mypush = push --receive-pack /path/to/git-receive-pack
【讨论】:
我尝试了您的建议,还在 .bashrc 中的路径中添加了“which git-receive-pack”,但不知何故 git push 仍然对我不起作用,尽管 repo 上传工作正常。知道为什么会发生这种情况吗? @coredump,设置“remote.origin.receivepack”应该消除修改 .bashrc 中的 PATH 的需要。自己尝试git push --receive-pack /full/path/to/git-receive-pack
,调整直到成功,然后修改.git/config(或运行“git config”)以永久设置接收包路径。
感谢大家的回复!在我的情况下,获取服务器和推送服务器是不同的,并且获取服务器没有写权限。当我使用 git push 对于 bash,它需要放入 .bashrc 而不是 .bash_profile(.bash_profile 也仅用于登录 shell)。
【讨论】:
【参考方案6】:确保 git-upload-pack
位于非登录 shell 的路径上。 (在我的机器上是/usr/bin
)。
要从非登录 shell 查看您的路径在远程计算机上的样子,请尝试以下操作:
ssh you@remotemachine echo \$PATH
(这适用于 Bash、Zsh 和 tcsh,可能也适用于其他 shell。)
如果返回的路径不包含git-upload-pack
所在的目录,则需要在.bashrc
(Bash)、.zshenv
(Zsh)、.cshrc
(对于 tcsh) 或您的 shell 的等效项。
您需要在远程计算机上进行此更改。
如果您不确定需要添加到远程PATH
的路径,您可以使用此命令找到它(您需要在远程机器上运行此命令):
which git-upload-pack
在我的机器上打印/usr/bin/git-upload-pack
。所以在这种情况下,/usr/bin
是您需要确保在远程非登录 shell PATH
中的路径。
【讨论】:
如果我在我的机器上运行该命令,路径是正确的,但如果我反过来运行它,则路径是错误的。 (从远程机器回到我的)编辑我的本地 .bashrc 修复它。谢谢 在我的情况下,找不到该命令,因为 git 是通过 MacPorts 安装的,它把它放在/opt/local/bin
中。通过PATH=$PATH:/new/path/here
将此添加到我的.bashrc
对我有用。
@ranReloaded 反斜杠应该转义美元符号并防止在本地机器上扩展 $PATH,而是将“echo $PATH”按字面意思传递给远程机器。这可能取决于您使用的外壳;它在 zsh 和 bash 中对我有用。您也许可以使用单引号获得正确的结果,例如“ssh you@remotemachine 'echo $PATH'” - 试一试。否则,您使用的是什么外壳?也许这里的其他人使用该外壳,可以为您提供解决方法。
@ranReloaded:当您说“未打印 git 路径”时,您的意思是 ssh 显示了很多东西,但没有显示 git 所在的路径吗?如果是这样,那么您遇到的问题与 OP 相同,并且使用符号链接只是一个创可贴。 "ssh .. echo \$PATH"
命令将向您显示远程计算机上的路径,这可能与您的登录路径不同,但这是使其正常工作的关键,您可以通过将 PATH 设置为包含 git 来做到这一点远程机器上的.bashrc
。根据手册页,.profile
/.bash_profile
仅用于交互式登录。
@ranReloaded:作为一个实验,在远程机器上,在你的主目录中,尝试摆脱所有其他 bash 点文件(.profile
,.bash_profile
, .login
、.bash_login
等)并且在.bashrc
中只有一行“export PATH=$PATH:/your/path/to/git”。然后,在本地机器上,尝试ssh you@remote echo \$PATH
:它应该显示最后带有 /your/path/to/git 的路径。如果可行,您应该能够在 ssh 上毫无问题地使用 git,并且您可以从 dotfiles 中放回其他内容。如果失败,请发布它显示的内容。【参考方案7】:
你必须添加
export PATH=/opt/git/bin:$PATH
.bashrc 中的这一行之前:
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
否则将不会执行所有导出语句 (see here)。
【讨论】:
【参考方案8】:我在使用 SSH 从 Windows 连接到 Gitolite 存储库时遇到问题,结果发现我的问题是 PLINK!它一直要求我输入密码,但 ssh gitolite@[host] 会很好地返回 repo 列表。
检查您的环境变量:GIT_SSH。如果它设置为 Plink,那么在没有任何值的情况下尝试它(“set GIT_SSH=”),看看是否有效。
【讨论】:
【参考方案9】:出于安全原因,Mac OS X 和其他一些 Unix 至少将用户路径编译到 sshd 中,因此我们这些将 git 安装为 /usr/local/git/bin,lib,... 的人可能会遇到麻烦因为 git 可执行文件不在预编译路径中。要覆盖这一点,我更喜欢编辑我的 /etc/sshd_config 更改:
#PermitUserEnvironment no
到
PermitUserEnvironment yes
然后根据需要创建 ~/.ssh/environment 文件。我的 git 用户在他们的 ~/.ssh/environment 文件中有以下内容:
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin
注意在读取 ~/.ssh/environment 文件时不会发生变量扩展:
PATH=$PATH:/usr/local/git/bin
不会工作。
【讨论】:
这似乎是一个完美的提示,但它不适用于 10.6.6。 ssh user@host echo \$PATH 仍然显示硬编码的构建路径。添加了具有非扩展所需路径的 .ssh/environment。更改 /etc/sshd_config PermitUserEnvironment 是。没有骰子。有什么建议?谢谢。 还尝试在客户端机器上设置 BASH_ENV='~/.nibashrc' 并在其中创建一个包含扩展路径的文件。也没有骰子。 好的。所以把路径放在你要连接的机器上的 .bashrc 中对我有用。 感谢关于变量扩展不适用于 .ssh/environment 的提示 赞成解释 var 扩展确实有效。【参考方案10】:您也可以使用“-u”选项来指定路径。我发现这对我的 .bashrc 没有在非交互式会话中获取来源的机器很有帮助。例如,
git clone -u /home/you/bin/git-upload-pack you@machine:code
【讨论】:
请注意:here 是关于如何使 .bashrc 在 ssh 会话中获取资源的说明。【参考方案11】:对于zsh,你需要把它放在这个文件中:~/.zshenv
例如,在 OS X 上使用 MacPorts 的 git-core 包:
$ echo 'export PATH=/opt/local/sbin:/opt/local/bin:$PATH' > ~/.zshenv
【讨论】:
【参考方案12】:我在使用 MsysGit 版本时遇到了这些错误。
在遵循了我在这里和其他地方可以找到的所有建议后,我最终:
安装 Cygwin 版本的 Git
在服务器上(带有 Cygwin SSHD 的 Win XP),这终于修复了它。
我还是用MsysGit版本的客户端
..事实上,这是它唯一的工作方式 对我来说,因为我得到 POSIX 错误 Cygwin Git 从同一个 sshd服务器
我怀疑在 Git 使用方面仍然需要做一些工作。 (在 Windows 中 ssh+易于拉/推)
【讨论】:
【参考方案13】:就像 Johan 多次指出需要它的 .bashrc 一样:
ln -s .bash_profile .bashrc
【讨论】:
【参考方案14】:我找到并(成功地)使用了这个修复:
# Fix it with symlinks in /usr/bin
$ cd /usr/bin/
$ sudo ln -s /[path/to/git]/bin/git* .
感谢Paul Johnston。
【讨论】:
【参考方案15】:Matt 的解决方案在 OS X 上不适合我,但 Paul 的解决方案可以。
Paul 链接的简短版本是:
使用以下文本创建 /usr/local/bin/ssh_session
:
#!/bin/bash
export SSH_SESSION=1
if [ -z "$SSH_ORIGINAL_COMMAND" ] ; then
export SSH_LOGIN=1
exec login -fp "$USER"
else
export SSH_LOGIN=
[ -r /etc/profile ] && source /etc/profile
[ -r ~/.profile ] && source ~/.profile
eval exec "$SSH_ORIGINAL_COMMAND"
fi
执行:
chmod +x /usr/local/bin/ssh_session
将以下内容添加到/etc/sshd_config
:
ForceCommand /usr/local/bin/ssh_session
【讨论】:
很高兴听到它对您不起作用。当您运行“ssh you@remote \$PATH”时,您介意告诉远程机器上的 PATH 是什么吗?以上是关于git-upload-pack:克隆远程 Git 存储库时找不到命令的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse:尝试克隆 CodeCommit 存储库并收到以下错误:“...git-upload-pack not allowed on...”
解决eclipse中egit中的cannot open git-upload-pack问题
如何解决:“无法打开 'git-upload-pack'” Eclipse 中的错误?
GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段
GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段