web-dev-qa-db-ja.com

git-upload-pack:リモートGitリポジトリのクローンを作成するときにコマンドが見つかりません

私はgitを使用して、プロジェクトの2つのコピーを同期させています。1つはローカルボックス、もう1つはテストサーバーです。これは、sshを使用してリモート開発サーバーにログオンするときに発生する問題です。

git clone [email protected]:/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 '[email protected]:/home/chris/myproject' failed.

(ファイル名は有罪を保護するために変更されました...!)

両方のボックスでSolaris 10 AMDが実行されます。 --upload-pack=$(which git-upload-pack)コマンドを追加した場合、いくつかの掘り下げを行いました(そして、RTFMソリューションに従って$PATHが 'git-upload-pack'へのパスを含むことを証明します)しかし、これは本当に迷惑で、「git Push」は動作しません。--unpack=オプションがないと思うからです。

ちなみに、すべてのgitコマンドはローカルボックスから正常に動作します。これは、/usr/local/binの同じNFSマウントにインストールされた同じバージョンのソフトウェア(1.5.4.2)です。

誰でも助けることができますか?

169

git-upload-packが非ログインシェルからのパス上にあることを確認してください。 (私のマシンでは/usr/binにあります)。

非ログインシェルからリモートマシン上のパスがどのように見えるかを確認するには、これを試してください:

ssh you@remotemachine echo \$PATH

(これは、Bash、Zsh、tcsh、およびおそらく他のシェルでも機能します。)

返されるパスにgit-upload-packがあるディレクトリが含まれていない場合、.bashrc(Bashの場合)、.zshenv(Zshの場合)、.cshrc(tcshの場合)またはシェルの同等物。

リモートマシンでこの変更を行う必要があります。

リモートPATHに追加する必要があるパスが不明な場合は、次のコマンドで見つけることができます(リモートマシンでこれを実行する必要があります)。

which git-upload-pack

/usr/bin/git-upload-packを印刷するマシン上。したがって、この場合、/usr/binは、リモートの非ログインシェルPATHにあることを確認する必要があるパスです。

169
Matt Curtis

「-u」オプションを使用してパスを指定することもできます。これは、非対話型セッションで.bashrcが取得されないマシンで役立ちます。例えば、

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

Brian's answer に基づいて、クローン作成後に次のコマンドを実行することにより、アップロードパックパスを永続的に設定できます。これにより、後続のプル/フェッチ要求で--upload-packが不要になります。同様に、receive-packを設定すると、Push要求で--receive-packが不要になります。

git config remote.Origin.uploadpack /path/to/git-upload-pack
git config remote.Origin.receivepack /path/to/git-receive-pack

これらの2つのコマンドは、次の行をリポジトリの.git/configに追加することと同等です。

[remote "Origin"]
    uploadpack = /path/to/git-upload-pack
    receivepack = /path/to/git-receive-pack

clone -uの頻繁なユーザーは、次のエイリアスに興味があるかもしれません。 mycloneは一目瞭然です。 myfetch/mypull/mypushは、git Pushgit 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
56
Garrett

私はこの修正を見つけて(正常に)使用しました:

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

ポールジョンストン に感謝します。

30
Andy

Mac OS Xと他のいくつかのUnixでは、少なくともセキュリティ上の理由からsshdにユーザーパスがコンパイルされているため、/ usr/local/git/{bin、lib、...}としてgitをインストールする私たちは、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

動作しないでしょう。

12
tom

Bashの場合は、.bash_profileではなく.bashrcに配置する必要があります(.bash_profileもログインシェル専用です)。

7
Johan Almqvist

MattのソリューションはOS Xでは私には機能しませんでしたが、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

6
Skeletron

MsysGitバージョンでこれらのエラーが発生しました。

ここや他の場所で見つけることができるすべてのアドバイスに従った後、私は結局:

cygwinバージョンのGitのインストール

サーバー(Cygwin SSHDを使用したWin XP)では、最終的に修正されました。

私はまだMsysGitバージョンのクライアント側を使用しています

..実際、その同じsshdサーバーからのCygwin GitプルでPOSIXエラーが発生するため、それが唯一の方法です。

私は、Gitのこの側面を使用するにはまだいくつかの作業が必要であると考えています。

5
Ric Tokyo

ヨハンが何度も指摘したように、必要な.bashrc:

ln -s .bash_profile .bashrc

1

追加する必要があります

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

.bashrcのこの行の前:

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

そうしないと、すべてのエクスポートステートメントが実行されません( こちらを参照 )。

1
Dennis

WindowsからSSHを使用してGitoliteリポジトリに接続する際に問題が発生しましたが、私の問題はPLINKであることが判明しました。パスワードを要求され続けましたが、ssh gitolite @ [Host]はレポジトリリストを正常に返しました。

環境変数を確認してください:GIT_SSH。 Plinkに設定されている場合、値なしで試して( "set GIT_SSH =")、それが機能するかどうかを確認します。

0
RAVolt

Zshの場合は、このファイルに〜/ .zshenvを配置する必要があります

たとえば、MacPortsのgit-coreパッケージを使用するOS Xの場合:

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

0
miknight

git-upload-packの場所をリモートgitユーザーの.bashrcファイルに追加します。

0
Yeison

私のケースはWin 10でGIT bashを使用しており、標準の場所にGITがありません。代わりに、/ app/local/binの下にgitがあります。 @Garrettが提供するコマンドを使用しましたが、double /で始まるようにパスを変更する必要があります。

git config remote.Origin.uploadpack //path/to/git-upload-pack
git config remote.Origin.receivepack //path/to/git-receive-pack

それ以外の場合、GITはWindows GITパスを前に追加します。

0
felixc