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


170

私はgitを使用してプロジェクトの2つのコピーを同期させています。1つはローカルボックス、もう1つはテストサーバーです。これは、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

誰か助けてもらえますか?

回答:


169

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

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

ssh you@remotemachine echo \$PATH

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

それが返すパスにが含まれているディレクトリが含まれていない場合は、(Bashの場合)、(Zshの場合)、(tcshの場合)、またはシェルと同等のgit-upload-pack設定で修正する必要があります。.bashrc.zshenv.cshrc

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

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

which git-upload-pack

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


2
自分のマシンでコマンドを実行した場合、パスは正しかったが、逆に実行した場合、パスは間違っていた。(リモートマシンから私のマシンに戻る)ローカルの.bashrcを編集すると修正されました。ありがとう
Chris Huang-Leaver

6
OSX Leopardで作業
ノアキャンベル

1
私の場合、gitがMacPortsを介してインストールされ、それがに配置されたため、コマンドは見つかりませんでした/opt/local/bin。これを私の.bashrcviaに追加するとPATH=$PATH:/new/path/hereうまくいきました。
Ben Scheirman、

1
@ranReloadedバックスラッシュは、ドル記号をエスケープし、ローカルマシンでの$ PATHの展開を防ぐことになっています。代わりに、文字通り "echo $ PATH"をリモートマシンに渡します。使用しているシェルによって異なる場合があります。zshとbashで動作します。たとえば、「ssh you @ remotemachine 'echo $ PATH'」のように、単一引用符を使用して正しい結果を得ることができる場合があります。それ以外の場合、どのシェルを使用していますか?多分ここにいる誰かがそのシェルを使用していて、あなたに回避策を与えることができます。
Matt Curtis

3
@ranReloaded:「gitパスが表示されない」と言った場合、sshは多くのものを表示するがgitが存在するパスは表示しないことを意味しますか?もしそうなら、あなたはOPが持っていたのと同じ問題を抱えており、シンボリックリンクを使うことはただのバンドエイドです。"ssh .. echo \$PATH" コマンドは、あなたのログインパスに異なる場合がありますリモートマシン、上のパスが表示されますが、これはそれを動作させるために権利を取得するために重要なことですが、あなたはにgitのを含めるようにPATHを設定することによってそれを行うことができます.bashrc上のリモートマシン。マンページによると、.profile/ .bash_profileは対話型ログインの場合にのみ読み取られます。
マットカーティス

66

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

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

2
それをありがとう。〜/ .bashrcファイルを変更したくありませんでした。
Luis、

2
注:ここでは、.bashrcをsshセッションで取得する方法について説明します。
sp3ctum 2013年

58

上に構築さブライアンの答えは、アップロードパックパスをする必要がなくなり、クローニングした後、以下のコマンドを実行して恒久的に設定することができ--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

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

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

の頻繁なユーザーはclone -u、次のエイリアスに興味がある可能性があります。mycloneは一目瞭然です。myfetch / mypull / mypushは、上記のようにに置き換えるなど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

への--receive-packオプションについて言及していただきありがとうございますgit-push
Axel

1
設定オプションについて言及していただきありがとうございます。これはユーザー空間からの便利なタッチです。
アロンアフマディア、2012年

私はあなたの提案を試しました、.bashrcのパスに「which git-receive-pack」も追加しましたが、どういうわけかgit pushはまだ機能していませんが、リポジトリのアップロードはうまくいきます。なぜこれが起こり得るのか?
コアダンプ

@coredump、「remote.origin.receivepack」を設定すると、.bashrcのPATHを変更する必要がなくなります。git push --receive-pack /full/path/to/git-receive-packそれ自身で試して、それが成功するまで微調整してから、.git / configを変更して(または「git config」を実行して)、受信パックのパスを永続的に設定します。
Garrett

皆様のご回答ありがとうございます!私の場合、フェッチサーバーとプッシュサーバーは異なり、フェッチサーバーには書き込み権限がありませんでした。git push <push-server> <branch>を使用すると、すべてが正常に動作します。
コアダンプ2012年


12

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

動作しないでしょう。


これは完璧なヒントのようですが、10.6.6では機能しません。ssh user @ host echo \ $ PATHは、ハードコードされたビルドパスを引き続き表示します。.ssh / environmentを追加し、必要なパスを拡張しない。/ etc / sshd_config PermitUserEnvironment yesを変更しました。サイコロはありません。助言がありますか?ありがとう。
お父さん

また、クライアントマシンでBASH_ENV = '〜/ .nibashrc'を設定し、その中に拡張パスを含むファイルを作成してみました。サイコロもありません。
お父さん

OK。そのため、接続先のマシンの.bashrcにパスを置くと、うまくいきました。
お父さん

変数の拡張が.ssh / environmentで機能しないというヒントをありがとう
Denis

var展開が機能することを説明する賛成票。
-XMAN

7

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が何であるかを教えていただけませんか。
Matt Curtis

7

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


5

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

私がここや他の場所で見つけることができるすべてのアドバイスをたどった後、私は結局終わりました:

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

サーバー(Cygwin SSHDを備えたWin XP)では、これでようやく修正されました。

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

..実際には、Cygwin Gitが同じsshdサーバーからプルされるとPOSIXエラーが発生するため、これが私にとっては唯一の方法です。

Gitを使用するこの側では、まだいくつかの作業が必要だと思います。(ssh + Windowsでのプル/プッシュの容易さ)



1

追加する必要があります

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

.bashrcのこの行の前:

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

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


1

私のケースは、GIT bashを使用したWin 10で、標準の場所に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パスを前に追加します。


0

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

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

$ echo 'エクスポートPATH = / opt / local / sbin:/ opt / local / bin:$ PATH'>〜/ .zshenv


0

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

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


0

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


0

リモートホストにgitをインストールするのと同じくらい簡単かもしれません(私の場合のように)。

sudo apt-get install git

または、他のパッケージ管理システムと同等です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.