我一直在使用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 = $(git-upload-pack)命令有效,(并证明 $ PATH 包含根据RTFM解决方案的'git-upload-pack'的路径)但这真的很烦人,加上'git push'不起作用,因为我认为没有 - unpack = 选项。

顺便提一下,所有的git命令都可以从我的本地方框中正常工作,它与软件的同一版本(1.5.4.2)安装在 / usr / local / bin 的同一个NFS挂载上。

有人可以帮忙吗?

有帮助吗?

解决方案

确保 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 的路径,可以使用此命令找到它(需要在远程计算机上运行):

git-upload-pack

在我的机器上打印 / usr / bin / git-upload-pack 。因此,在这种情况下, / usr / bin 是您需要确保在远程非登录shell PATH 中的路径。

其他提示

你也可以使用“-u”用于指定路径的选项。我发现这对我的.bashrc不会在非交互式会话中获取的机器很有用。例如,

git clone -u /home/you/bin/git-upload-pack you@machine:code

建立在 Brian's回答,可以通过在克隆后运行以下命令永久地设置upload-pack路径,这样就不需要在后续的pull / fetch请求中使用 - 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

我找到并使用了(成功)此修复程序:

# Fix it with symlinks in /usr/bin
$ cd /usr/bin/
$ sudo ln -s /[path/to/git]/bin/git* .

感谢 Paul Johnston

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

无效。

对于bash,它需要放入.bashrc而不是.bash_profile(.bash_profile也只适用于登录shell)。

Matt的解决方案在OS X上对我不起作用,但保罗的确如此。

保罗链接的简短版本是:

使用以下文字创建 / 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

我在MsysGit版本中遇到了这些错误。

在遵循我在这里和其他地方找到的所有建议后,我最终:

  

安装Cygwin版本的Git

服务器上的

(使用Cygwin SSHD的Win XP),这最终修复了它。

我仍然使用MsysGit版本客户端

  

..实际上,它是唯一可行的方式   对我来说,因为我得到了POSIX错误   Cygwin Git也是如此   sshd服务器

我怀疑Git使用这方面还需要做一些工作.. (ssh +在Windows中轻松拉/推)

就像约翰多次指出它需要的.bashrc一样:

ln -s .bash_profile .bashrc

您必须添加

export PATH=/opt/git/bin:$PATH

在.bashrc中的这一行之前:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

否则所有导出语句都不会被执行(见这里)。

对于zsh,你需要把它放在这个文件中:〜/ .zshenv

例如,在OS X上使用MacPorts的git-core软件包:

$ echo'export PATH = / opt / local / sbin:/ opt / local / bin:$ PATH'> 〜/ .zshenv

我一直在使用Windows从SSH连接到Gitolite repo时遇到问题,结果发现我的问题是PLINK!它一直在问我密码,但ssh giteolite @ [host]会让回购清单恢复正常。

检查您的环境变量:GIT_SSH。如果设置为Plink,则尝试没有任何值(“设置GIT_SSH =”),看看是否有效。

git-upload-pack 的位置添加到远程git用户的.bashrc文件中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top