git-upload-pack: uzak Git kopyasını kopyalarken komut bulunamadı


170

Git'i projemin iki kopyasını senkronize tutmak için kullanıyorum, biri yerel kutum, diğeri test sunucusu. Bu, ssh kullanarak uzaktan geliştirme sunucumuza oturum açtığımda oluşan bir sorundur;

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.

(suçluyu korumak için dosya adları değiştirildi ...!)

Her iki kutu da Solaris 10 AMD kullanıyor. --upload-pack=$(which git-upload-pack)Komut çalışmaları eklersem biraz kazma yaptım (ve $PATHRTFM çözümüne göre 'git-upload-pack' yolunu içeren kanıtlar ) ama bu gerçekten can sıkıcı, artı 'git push' çalışmıyor, çünkü bir --unpack=seçenek olduğunu sanmıyorum .

Bu arada, tüm git komutları yerel kutumdan iyi çalışıyor, aynı NFS montajında ​​yüklü olan yazılımın (1.5.4.2) aynı sürümüdür /usr/local/bin.

Birisi yardım edebilir mi?

Yanıtlar:


169

git-upload-packGiriş yapmayan bir kabuktan gelen yolda olduğundan emin olun . (Makinemde /usr/bin).

Giriş yapmayan bir kabuktan uzak makinede yolunuzun nasıl göründüğünü görmek için şunu deneyin:

ssh you@remotemachine echo \$PATH

(Bu Bash, Zsh ve tcsh'de ve muhtemelen diğer mermilerde de çalışır.)

Geri verdiği yol sahip olan dizini içermiyorsa, git-upload-packonu .bashrc(Bash için), .zshenv(Zsh için), .cshrc(tcsh için) veya kabuğunuz için eşdeğer olarak ayarlayarak düzeltmeniz gerekir .

Bu değişikliği uzak makinede yapmanız gerekecektir.

Uzaktan kumandanıza hangi yolu eklemeniz gerektiğinden emin PATHdeğilseniz, bu komutla bu yolu bulabilirsiniz (bunu uzak makinede çalıştırmanız gerekir):

which git-upload-pack

Baskı makinemde /usr/bin/git-upload-pack. Bu durumda, /usr/bingiriş yapmayan uzak kabuğunuzda olduğundan emin olmanız gereken yol budur PATH.


2
Komutu makinemde çalıştırırsam yol doğruydu, ancak başka bir şekilde çalıştırırsam yanlıştı. (uzak makineden benimkine) Yerel .bashrc ayarımı düzeltti. Teşekkürler
Chris Huang-Leaver

6
OSX Leopard üzerinde çalıştı
Noah Campbell

1
Benim durumumda git, MacPorts aracılığıyla yüklendiği için komut bulunamadı /opt/local/bin. Benim için bu ekleme .bashrcyoluyla PATH=$PATH:/new/path/herebenim için çalıştı.
Ben Scheirman

1
@ranReloaded Ters eğik çizginin dolar işaretinden kaçması ve yerel makinede $ PATH genişlemesini engellemesi ve bunun yerine "echo $ PATH" kelimesini uzaktaki makineye geçirmesi gerekiyor. Hangi kabuğu kullandığınıza bağlı olabilir; benim için zsh ve bash'da çalışıyor. Tek bir alıntı kullanarak doğru sonucu elde edebilirsiniz, örneğin "ssh you @ remotemachine 'echo $ PATH'" - bunu deneyin. Aksi takdirde hangi kabuğu kullanıyorsunuz? Belki burada başka biri bu kabuğu kullanır ve size geçici çözümü verebilir.
Matt Curtis

3
@ranReloaded: "git yolu yazdırılmadı" derken, ssh çok fazla şey gösterir, ama git'in açık olduğu yolu göstermez mi? Eğer öyleyse, OP ile aynı probleminiz var ve bir symlink kullanmak sadece bir bandaid. "ssh .. echo \$PATH" Komut size giriş yoluna farklı olabilir uzak makine üzerinde yol gösterecektir, ancak bu çalışması için doğru almak için önemli şey olduğunu ve içinde budala dahil etmek PATH ayarlayarak bunu yapabilir .bashrcüzerinde uzak makine. Bu sayfaya göre, .profile/ .bash_profileyalnızca etkileşimli oturumlar için okunur.
Matt Curtis

66

Yolu belirtmek için "-u" seçeneğini de kullanabilirsiniz. Bunu .bashrc'nin etkileşimli olmayan oturumlarda kaynaklanmadığı makinelerde yararlı buluyorum. Örneğin,

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

2
Bunun için teşekkürler. ~ / .Bashrc dosyasını gerçekten değiştirmek istemedim.
Luis

2
Sadece not etmek için: İşte .bashrc'nin ssh oturumlarında nasıl kaynaklanacağı konusunda talimatlar.
sp3ctum

58

Brian'ın cevabına dayanarak , yükleme paketi yolu klonlamadan sonra aşağıdaki komutları çalıştırarak kalıcı olarak ayarlanabilir, bu --upload-packda sonraki çekme / getirme isteklerine olan ihtiyacı ortadan kaldırır . Benzer şekilde, alma-paketinin ayarlanması --receive-pack, push isteklerine olan ihtiyacı ortadan kaldırır .

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

Bu iki komut, aşağıdaki satırları bir depoya eklemekle eşdeğerdir .git/config.

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

Kullanıcısının sık kullanıcıları clone -uaşağıdaki takma adlarla ilgilenebilir. myclone kendi kendini açıklamalı olmalıdır. myfetch / mypull / mypush olan yapılandırma değiştirerek yukarıda tarif edildiği gibi modifiye edilmemiştir depolarında kullanılabilir git pushile git mypush, ve böyle devam eder.

[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-packSeçeneğinden bahsettiğiniz için teşekkürler git-push!
Axel

1
Yapılandırma seçeneklerinden bahsettiğiniz için teşekkürler, bu kullanıcı alanından faydalı bir dokunuş.
Aron Ahmadia

Ben öneri denedim, ayrıca .bashrc yolunda "hangi git-almak-paketi" ekledi ama repo yükleme iyi çalışıyor olsa da, bir şekilde git push hala benim için çalışmıyor. Bunun neden olabileceği hakkında bir fikrin var mı?
coredump

@coredump, "remote.origin.receivepack" ayarının .bashrc dosyanızdaki PATH değerini değiştirme gereğini ortadan kaldırması gerekir. git push --receive-pack /full/path/to/git-receive-packKendi başına deneyin , bu başarılı olana kadar ince ayar yapın, ardından alma paketi yolunu kalıcı olarak ayarlamak için .git / config dosyasını değiştirin (veya "git config" komutunu çalıştırın).
Garrett

Yanıtlarınız için herkese teşekkürler! Benim durumumda, getirme sunucusu ve push sunucusu farklıydı ve getirme sunucusunun yazma izinleri yoktu. git <push-server> <branch> tuşuna bastığımda her şey yolunda gidiyor.
coredump

30

Bu düzeltmeyi buldum ve (başarıyla) kullandım:

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

Paul Johnston'a teşekkürler .


benim için de düzeltildi. Teşekkürler!
John Ballinger

12

Mac OS X ve diğer bazı Unix'ler güvenlik nedenleriyle en azından kullanıcı yolunun sshd olarak derlenmesini sağlar, böylece git / usr / local / git / {bin, lib, ...} olarak gidenler git gibi sorunla karşılaşabilir yürütülebilir dosyalar önceden derlenmiş yolda değildir. Bunu geçersiz kılmak için / etc / sshd_config değişikliğimi düzenlemeyi tercih ederim:

#PermitUserEnvironment no

için

PermitUserEnvironment yes

ve sonra gerektiği gibi ~ / .ssh / ortam dosyaları oluşturun. Git kullanıcılarım ~ / .ssh / ortam dosyalarında aşağıdakiler var:

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin

Not ~ / .ssh / ortam dosyası şu şekilde okunduğunda değişken genişletme gerçekleşmez:

PATH=$PATH:/usr/local/git/bin

çalışmayacak.


Bu mükemmel bir ipucu gibi görünüyor, ancak burada 10.6.6 için çalışmıyor. ssh user @ host echo \ $ PATH hala sabit kodlanmış derleme yolunu gösterir. Genişleyen gerekli olmayan yol ile .ssh / ortam ekledi. / Etc / sshd_config PermitUserEnvironment değişti evet. nafile. Baska öneri? Teşekkürler.
Baba

Ayrıca istemci makinede BASH_ENV = '~ / .nibashrc' ayarlamayı ve içinde genişletilmiş yol bulunan bir dosya oluşturmayı denedi. ayrıca zar yok.
Baba

Tamam. bağlandığınız makinenin yolunu .bashrc içine koymak benim için çalıştı.
Baba

değişken genişleme hakkında ipucu için teşekkürler .ssh / çevre
Denis

Var genişlemesinin işe yaradığını açıklamak için oy verin.
XMAN

7

Matt'in çözümü benim için OS X'te işe yaramadı, ama Paul's.

Paul'un bağlantısından kısa versiyon:

/usr/local/bin/ssh_sessionAşağıdaki metinle oluşturuldu :

#!/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

Yürütme:

chmod +x /usr/local/bin/ssh_session

Aşağıdakileri şuraya ekleyin /etc/sshd_config:

ForceCommand / usr / local / bin / ssh_session


Sizin için işe yaramadığını duymak ilginç. "Ssh you @ remote \ $ PATH" komutunu çalıştırdığınızda, uzak makinede PATH'nin ne olduğunu söylemenin bir sakıncası var mı?
Matt Curtis

7

Bash için .bash_profile değil .bashrc içine konulmalıdır (.bash_profile sadece giriş kabukları içindir).


5

Bu hataları MsysGit sürümü ile aldım.

Burada ve başka yerlerde bulabildiğim tüm tavsiyeleri takip ettikten sonra sona erdim:

Git'in Cygwin sürümünü yükleme

sunucuda (Cygwin SSHD ile Win XP), bu sonunda düzeltildi.

Hala MsysGit sürüm istemci tarafı kullanıyorum

... aslında, aynı sshd sunucusundan Cygwin Git çekme ile POSIX hataları aldığım için benim için tek yolu bu

Git kullanımının bu tarafında hala bazı çalışmalara ihtiyaç duyulduğundan şüpheleniyorum .. (Windows'ta ssh + çekme / itme kolaylığı)


1

Johan'ın birçok kez ihtiyaç duyduğu .bashrc'yi işaret ettiği gibi:

ln -s .bash_profile .bashrc


1

Eklemeniz gerekir

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

.bashrc'deki bu satırdan önce:

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

Aksi takdirde tüm dışa aktarma ifadeleri yürütülmez ( buraya bakın ).


1

Benim durumum GIT bash ile Win 10'da ve standart konum altında bir GIT yok. Bunun yerine git / app / local / bin altında var. @Garrett tarafından sağlanan komutları kullandım, ancak double / ile başlamak için yolu değiştirmeniz gerekiyor:

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

Aksi takdirde GIT, Windows GIT yolunuzu öne ekleyecektir.


0

Zsh için bu dosyaya koymanız gerekir: ~ / .zshenv

Örneğin, MacPorts'tan git-core paketini kullanan OS X'te:

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


0

Windows SSH kullanarak bir Gitolit repo bağlanma sorunları yaşıyorum ve benim sorun PLINK olduğu ortaya çıktı! Benden bir şifre sormaya devam etti, ancak ssh gitolite @ [host] repo listesini iyi döndürecekti.

Ortam değişkeninizi kontrol edin: GIT_SSH. Plink olarak ayarlanmışsa, herhangi bir değer olmadan deneyin ("set GIT_SSH =") ve çalışıp çalışmadığına bakın.


0

git-upload-packAdresinin konumunu uzak git kullanıcısının .bashrc dosyasına ekleyin.


0

Git'i uzak ana bilgisayara yüklemek kadar basit olabilir (benim durumumda olduğu gibi).

sudo apt-get install git

Veya diğer paket yönetim sistemleri için eşdeğerdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.