git-upload-pack: ไม่พบคำสั่งเมื่อทำการโคลน Git repo ระยะไกล


170

ฉันใช้คอมไพล์เพื่อเก็บสำเนาสองชุดของโครงการของฉันในการซิงค์หนึ่งคือกล่องภายในเครื่องของฉันและอื่น ๆ เซิร์ฟเวอร์ทดสอบ นี่เป็นปัญหาที่เกิดขึ้นเมื่อฉันเข้าสู่เซิร์ฟเวอร์การพัฒนาระยะไกลของเราโดยใช้ 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มีเส้นทางไปที่ 'git-upload-pack' ตามวิธี RTFM) แต่นี่มันน่ารำคาญจริงๆบวก 'git push' ไม่ทำงาน เพราะฉันไม่คิดว่าจะมี--unpack=ตัวเลือก

อนึ่งทุกคอมไพล์คำสั่งปรับการทำงานจากช่องท้องถิ่นของฉันมันเป็นรุ่นเดียวกันของซอฟแวร์ (1.5.4.2) การติดตั้งบน NFS /usr/local/binเดียวกันติดที่

ใครช่วยได้บ้าง

คำตอบ:


169

ตรวจสอบให้แน่ใจว่าgit-upload-packอยู่บนเส้นทางจากเชลล์ที่ไม่ใช่การเข้าสู่ระบบ (บนเครื่องของฉันมันอยู่ใน/usr/bin)

ในการดูว่าพา ธ ของคุณมีลักษณะอย่างไรบนเครื่องระยะไกลจากเชลล์ที่ไม่ใช่การเข้าสู่ระบบให้ลองทำสิ่งนี้:

ssh you@remotemachine echo \$PATH

(ใช้งานได้ใน Bash, Zsh และ tcsh และอาจเป็น shell อื่น ๆ ด้วย)

หากเส้นทางที่ให้คืนไม่รวมไดเรกทอรีที่มีgit-upload-packคุณจะต้องแก้ไขโดยตั้งค่าเป็น.bashrc(สำหรับ Bash), .zshenv(สำหรับ Zsh).cshrc (สำหรับ tcsh) หรือเทียบเท่าสำหรับเปลือกของคุณ

คุณจะต้องทำการเปลี่ยนแปลงนี้บนเครื่องระยะไกล

หากคุณไม่แน่ใจว่าพา ธ ใดที่คุณต้องการเพิ่มในรีโมตของPATHคุณคุณสามารถค้นหาได้ด้วยคำสั่งนี้ (คุณจำเป็นต้องรันสิ่งนี้บนเครื่องระยะไกล):

which git-upload-pack

บนเครื่องที่พิมพ์/usr/bin/git-upload-packออกมา ดังนั้นในกรณีนี้เป็นเส้นทางที่คุณต้องให้แน่ใจว่าอยู่ในเปลือกที่ไม่ได้เข้าสู่ระบบระยะไกลของคุณ/usr/binPATH


2
เส้นทางนั้นถูกต้องหากฉันเรียกใช้คำสั่งบนเครื่องของฉัน แต่ผิดถ้าฉันเรียกใช้วิธีอื่น ๆ (จากเครื่องระยะไกลกลับไปที่เหมือง) การแก้ไข. bashrc ในพื้นที่ของฉันแก้ไข ขอบคุณ
Chris Huang-Leaver

6
ทำงานกับ OSX Leopard
Noah Campbell เมื่อ

1
ในกรณีของคำสั่งไม่พบเพราะคอมไพล์ได้รับการติดตั้งผ่าน MacPorts /opt/local/binซึ่งทำให้มันอยู่ใน การเพิ่มสิ่งนี้ไปยังของฉัน.bashrcผ่านการPATH=$PATH:/new/path/hereทำงานสำหรับฉัน
Ben Scheirman

1
@ranReloaded เครื่องหมายแบ็กสแลชควรหลีกเลี่ยงเครื่องหมายดอลลาร์และป้องกันการขยาย $ PATH บนเครื่องท้องถิ่นและแทนที่จะส่ง "echo $ PATH" ตามตัวอักษรไปยังเครื่องระยะไกล มันอาจขึ้นอยู่กับว่าคุณใช้เชลล์อะไรอยู่ มันทำงานให้ฉันใน zsh และทุบตี คุณอาจได้รับผลลัพธ์ที่ถูกต้องโดยใช้เครื่องหมายคำพูดเดี่ยวเช่น "ssh you @ remotemachine 'echo $ PATH'" - ไปได้เลย มิฉะนั้นคุณใช้เปลือกอะไร บางทีคนอื่นที่นี่ใช้เชลล์นั้นและให้วิธีแก้ปัญหาแก่คุณ
Matt Curtis

3
@ranReloaded: เมื่อคุณพูดว่า "เส้นทาง git ไม่ถูกพิมพ์" หมายความว่า ssh แสดงเนื้อหามากมาย แต่ไม่ใช่เส้นทางที่ git เปิดอยู่หรือไม่ ถ้าเป็นเช่นนั้นคุณมีปัญหาเดียวกับที่ OP มีและการใช้ symlink เป็นเพียง bandaid "ssh .. echo \$PATH" คำสั่งจะแสดงเส้นทางบนเครื่องระยะไกลซึ่งอาจจะแตกต่างกันไปยังเส้นทางการเข้าสู่ระบบของคุณ แต่นี้เป็นสิ่งสำคัญที่จะได้รับสิทธิที่จะทำให้มันทำงานและคุณสามารถทำเช่นนั้นโดยการตั้งค่าเส้นทางที่จะรวมถึงคอมไพล์ใน.bashrcบน เครื่องระยะไกล ตาม manpage .profile/ .bash_profileจะถูกอ่านสำหรับการเข้าสู่ระบบแบบโต้ตอบเท่านั้น
Matt Curtis

66

คุณยังสามารถใช้ตัวเลือก "-u" เพื่อระบุเส้นทาง ฉันพบว่าสิ่งนี้มีประโยชน์สำหรับเครื่องที่. bashrc ของฉันไม่ได้รับแหล่งข้อมูลในเซสชันที่ไม่มีการโต้ตอบ ตัวอย่างเช่น,

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

2
ขอบคุณสำหรับสิ่งนั้น ฉันไม่ต้องการเปลี่ยนไฟล์ ~ / .bashrc จริงๆ
หลุยส์

2
ที่ควรทราบ: ต่อไปนี้เป็นคำแนะนำเกี่ยวกับวิธีการสร้าง. bashrc ที่มาจากเซสชัน ssh
sp3ctum

58

เมื่อสร้างคำตอบของ Brianเส้นทางการอัพโหลดจะสามารถตั้งค่าได้อย่างถาวรโดยการเรียกใช้คำสั่งต่อไปนี้หลังจากการโคลนซึ่งทำให้ไม่ต้องใช้--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

ทั้งสองคำสั่งจะเทียบเท่ากับการเพิ่มบรรทัดต่อไปนี้ไปยัง .git/configrepo

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

ผู้ใช้ที่ใช้บ่อยclone -uอาจสนใจนามแฝงต่อไปนี้ พายุไซโคลนควรอธิบายด้วยตนเอง myfetch / mypull / mypush สามารถใช้กับ repos ที่ config ยังไม่ได้รับการแก้ไขตามที่อธิบายไว้ข้างต้นโดยแทนที่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
ขอบคุณที่พูดถึงตัวเลือกการกำหนดค่าซึ่งเป็นประโยชน์จากการใช้พื้นที่
Aron Ahmadia

ฉันลองใช้คำแนะนำของคุณแล้วเพิ่ม "ซึ่ง git-receive-pack" ไปยังพา ธ ใน. bashrc แต่อย่างใด git push ยังไม่ทำงานสำหรับฉันแม้ว่า repo อัปโหลดทำงานได้ดี มีความคิดว่าทำไมสิ่งนี้ถึงเกิดขึ้นได้บ้าง?
coredump

@coredump การตั้งค่า "remote.origin.receivepack" ไม่จำเป็นต้องแก้ไข PATH ใน. bashrc ของคุณ ลองgit push --receive-pack /full/path/to/git-receive-packด้วยตัวเองบิดจนกว่าจะประสบความสำเร็จจากนั้นแก้ไข. git / config (หรือเรียกใช้ "git config") เพื่อตั้งเส้นทางรับแพ็คอย่างถาวร
Garrett

ขอบคุณทุกคนสำหรับคำตอบของคุณ! ในกรณีของฉันเซิร์ฟเวอร์การดึงข้อมูลและเซิร์ฟเวอร์การพุชนั้นแตกต่างกันและเซิร์ฟเวอร์การดึงข้อมูลไม่มีสิทธิ์ในการเขียน เมื่อฉันใช้ git push <push-server> <branch> ทุกอย่างทำงานได้ดี
coredump

30

ฉันพบและใช้ (สำเร็จ) การแก้ไขนี้:

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

ขอขอบคุณที่พอลจอห์นสัน


คงที่สำหรับฉันเช่นกัน ขอบคุณ!
John Ballinger

12

Mac OS X และ Unixes อื่น ๆ อย่างน้อยมีพา ธ ผู้ใช้ที่คอมไพล์เป็น sshd ด้วยเหตุผลด้านความปลอดภัยดังนั้นพวกเราที่ติดตั้ง git เป็น / usr / local / git / {bin, lib, ... } สามารถพบปัญหาได้เช่น git executables ไม่ได้อยู่ในเส้นทางที่คอมไพล์แล้ว หากต้องการลบล้างสิ่งนี้ฉันต้องการแก้ไขการเปลี่ยนแปลง / 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 ใช้งานได้หรือไม่
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


น่าสนใจที่จะได้ยินว่ามันไม่ได้ผลสำหรับคุณ คุณรังเกียจที่จะบอกสิ่งที่มันบอกว่า PATH บนเครื่องรีโมตเมื่อคุณวิ่ง "ssh you @ remote \ $ PATH" หรือไม่?
Matt Curtis

7

สำหรับ bash จำเป็นต้องใส่ใน. bashrc ไม่ใช่. bash_profile (.bash_profile เป็นเพียงสำหรับเชลล์ล็อกอินเท่านั้น)


5

ฉันพบข้อผิดพลาดกับรุ่น MsysGit

หลังจากทำตามคำแนะนำทั้งหมดที่ฉันสามารถหาได้ที่นี่และที่อื่นฉันก็ลงเอยที่:

ติดตั้ง Git รุ่น Cygwin

บนเซิร์ฟเวอร์ (Win XP พร้อม Cygwin SSHD) ในที่สุดก็แก้ไขได้

ฉันยังคงใช้ฝั่งไคลเอ็นต์เวอร์ชัน MsysGit

.. ในความเป็นจริงมันเป็นวิธีเดียวที่ได้ผลสำหรับฉันเนื่องจากฉันได้รับข้อผิดพลาด POSIX ด้วยการดึง Cygwin Git จากเซิร์ฟเวอร์ sshd เดียวกัน

ฉันสงสัยว่างานบางอย่างยังคงต้องใช้ Git ด้านนี้ .. (ssh + ความง่ายในการดึง / ดันใน Windows)



1

คุณต้องเพิ่ม

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

หน้าบรรทัดนี้ใน. bashrc:

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

มิฉะนั้นใบแจ้งการส่งออกทั้งหมดจะไม่ถูกดำเนินการ ( ดูที่นี่ )


1

กรณีของฉันอยู่บน Win 10 ที่มีทุบตี GIT และฉันไม่มี GIT ในตำแหน่งมาตรฐาน ฉันมีคอมไพล์ภายใต้ / app / local / bin ฉันใช้คำสั่งจาก @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

สำหรับ zsh คุณต้องใส่ไว้ในไฟล์นี้: ~ / .zshenv

ตัวอย่างเช่นบน OS X โดยใช้แพ็คเกจ git-core จาก MacPorts:

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


0

ฉันมีปัญหาในการเชื่อมต่อกับ Gitolite repo โดยใช้ SSH จาก Windows และปรากฎว่าปัญหาของฉันคือ PLINK! มันยังคงถามรหัสผ่านไว้ แต่ ssh gitolite @ [host] จะคืนค่ารายการ repo

ตรวจสอบตัวแปรสภาพแวดล้อมของคุณ: GIT_SSH หากตั้งค่าเป็น Plink ให้ลองโดยไม่มีค่าใด ๆ ("set GIT_SSH =") และดูว่าใช้งานได้หรือไม่


0

เพิ่มตำแหน่งของคุณgit-upload-packลงในไฟล์. bashrc ของผู้ใช้รีโมต


0

มันอาจจะง่ายเหมือนการติดตั้งคอมไพล์บนรีโมตโฮสต์ (เหมือนในกรณีของฉัน)

sudo apt-get install git

หรือเทียบเท่ากับระบบการจัดการแพ็คเกจอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.