git-upload-pack: không tìm thấy lệnh, khi sao chép từ xa Git repo


170

Tôi đã sử dụng git để giữ đồng bộ hai bản sao dự án của mình, một bản là hộp cục bộ của tôi, bản còn lại là máy chủ thử nghiệm. Đây là một vấn đề xảy ra khi tôi đăng nhập vào máy chủ phát triển từ xa bằng 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.

(tên tệp đã được thay đổi để bảo vệ người có tội ...!)

Cả hai hộp đều chạy Solaris 10 AMD. Tôi đã thực hiện một số thao tác đào, nếu tôi thêm --upload-pack=$(which git-upload-pack)lệnh hoạt động, (và chứng minh rằng $PATHcó chứa đường dẫn đến 'git-upload-pack' theo giải pháp RTFM) nhưng điều này thực sự gây phiền nhiễu, cộng với 'git đẩy' không hoạt động, bởi vì tôi không nghĩ rằng có một --unpack=lựa chọn.

Ngẫu nhiên, tất cả các lệnh git hoạt động tốt từ hộp cục bộ của tôi, đó là cùng một phiên bản của phần mềm (1.5.4.2), được cài đặt trên cùng một ngàm NFS tại /usr/local/bin.

Ai có thể giúp đỡ?

Câu trả lời:


169

Hãy chắc chắn rằng git-upload-packtrên đường dẫn từ một vỏ không đăng nhập. (Trên máy của tôi, nó ở trong /usr/bin).

Để xem đường dẫn của bạn trông như thế nào trên máy từ xa từ vỏ không đăng nhập, hãy thử điều này:

ssh you@remotemachine echo \$PATH

(Điều đó hoạt động trong Bash, Zsh và tcsh, và có lẽ các shell khác nữa.)

Nếu đường dẫn mà nó trả lại không bao gồm thư mục có git-upload-pack, bạn cần sửa nó bằng cách đặt nó trong .bashrc(cho Bash), .zshenv(cho Zsh), .cshrc(cho tcsh) hoặc tương đương cho shell của bạn.

Bạn sẽ cần thực hiện thay đổi này trên máy từ xa.

Nếu bạn không chắc chắn đường dẫn nào bạn cần thêm vào điều khiển từ xa PATH, bạn có thể tìm thấy nó bằng lệnh này (bạn cần chạy nó trên máy từ xa):

which git-upload-pack

Trên máy của tôi mà in /usr/bin/git-upload-pack. Vì vậy, trong trường hợp này, /usr/binlà đường dẫn bạn cần đảm bảo nằm trong vỏ không đăng nhập từ xa PATH.


2
Đường dẫn là chính xác nếu tôi chạy lệnh trên máy của tôi, nhưng sai nếu tôi chạy nó theo cách khác. (từ máy từ xa trở về của tôi) Chỉnh sửa .bashrc cục bộ của tôi đã sửa nó. Cảm ơn
Chris Huang-Leaver

6
Đã làm việc trên OSX Leopard
Noah Campbell

1
Trong trường hợp của tôi, lệnh không được tìm thấy vì git đã được cài đặt thông qua MacPorts, nó đặt nó vào /opt/local/bin. Thêm điều này vào .bashrcthông qua PATH=$PATH:/new/path/herelàm việc cho tôi.
Ben Scheirman

1
@ranReloaded Dấu gạch chéo ngược được cho là để thoát ký hiệu đô la và ngăn chặn việc mở rộng $ PATH trên máy cục bộ, và thay vào đó chuyển "echo $ PATH" theo nghĩa đen cho máy từ xa. Nó có thể phụ thuộc vào loại vỏ bạn đang sử dụng; nó hoạt động với tôi trong zsh và bash. Bạn có thể có được kết quả đúng bằng các dấu ngoặc đơn, ví dụ: "ssh you @ remotemachine 'echo $ PATH'" - hãy thử đi. Nếu không, bạn đang sử dụng vỏ gì? Có lẽ ai đó ở đây sử dụng vỏ đó và có thể cung cấp cho bạn cách giải quyết.
Matt Curtis

3
@ranReloaded: Khi bạn nói "đường dẫn git không được in", bạn có nghĩa là ssh hiển thị nhiều nội dung nhưng không phải là đường dẫn git đang bật? Nếu vậy thì bạn cũng gặp vấn đề tương tự như OP và việc sử dụng symlink chỉ là một dải băng. Các "ssh .. echo \$PATH" lệnh sẽ hiển thị cho bạn những đường dẫn trên máy từ xa, có thể khác với con đường đăng nhập của bạn, nhưng đây là điều rất quan trọng để có được quyền để làm cho nó hoạt động, và bạn có thể làm điều đó bằng cách thiết lập PATH để bao gồm git trong .bashrctrên máy từ xa. Theo trang web, .profile/ .bash_profilechỉ được đọc cho đăng nhập tương tác.
Matt Curtis

66

Bạn cũng có thể sử dụng tùy chọn "-u" để chỉ định đường dẫn. Tôi thấy điều này hữu ích trên các máy mà .bashrc của tôi không có nguồn gốc trong các phiên không tương tác. Ví dụ,

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

2
Cảm ơn vì điều đó. Tôi thực sự không muốn thay đổi tệp ~ / .bashrc.
Luis

2
Chỉ cần lưu ý: đây là hướng dẫn về cách tạo .bashrc có nguồn gốc trong các phiên ssh.
sp3ctum

58

Dựa trên câu trả lời của Brian , đường dẫn gói tải lên có thể được đặt vĩnh viễn bằng cách chạy các lệnh sau sau khi nhân bản, loại bỏ sự cần thiết cho --upload-packcác yêu cầu kéo / tìm nạp tiếp theo. Tương tự, cài đặt gói nhận sẽ loại bỏ nhu cầu --receive-packvề các yêu cầu đẩy.

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

Hai lệnh này tương đương với việc thêm các dòng sau vào một repo .git/config.

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

Người dùng thường xuyên clone -ucó thể quan tâm đến các bí danh sau. myclone nên tự giải thích. myfetch / mypull / mypush có thể được sử dụng trên Repos có cấu hình chưa được sửa đổi như mô tả ở trên bằng cách thay thế git pushvới git mypush, và vân vân.

[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

Cảm ơn đã đề cập đến các --receive-packtùy chọn để git-push!
Axel

1
Cảm ơn bạn đã đề cập đến các tùy chọn cấu hình, đó là một liên lạc hữu ích từ không gian người dùng.
Aron Ahmadia

Tôi đã thử đề xuất của bạn, cũng đã thêm "which git-receive-pack" vào đường dẫn trong .bashrc nhưng bằng cách nào đó git đẩy vẫn không hoạt động với tôi, mặc dù tải lên repo hoạt động tốt. Bất cứ ý tưởng tại sao điều này có thể xảy ra?
coredump

@coredump, thiết lập "remote.origin.receivepack" sẽ loại bỏ sự cần thiết phải sửa đổi PATH trong .bashrc của bạn. Hãy git push --receive-pack /full/path/to/git-receive-packtự mình thử, chỉnh cho đến khi thành công, sau đó sửa đổi .git / config (hoặc chạy "git config") để đặt vĩnh viễn đường dẫn gói nhận.
Garrett

Cảm ơn tất cả mọi người đã phản hồi! Trong trường hợp của tôi, máy chủ tìm nạp và máy chủ đẩy là khác nhau và máy chủ tìm nạp không có quyền ghi. Khi tôi sử dụng git push <push-server> <Branch> mọi thứ đều hoạt động tốt.
coredump

30

Tôi đã tìm và sử dụng (thành công) bản sửa lỗi này:

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

Cảm ơn Paul Johnston .


cố định cho tôi là tốt. Cảm ơn!
John Ballinger

12

Mac OS X và một số Unix khác ít nhất có đường dẫn người dùng được biên dịch thành sshd vì lý do bảo mật, vì vậy những người trong chúng ta cài đặt git là / usr / local / git / {bin, lib, ...} có thể gặp rắc rối như git thực thi không nằm trong đường dẫn được biên dịch trước. Để ghi đè điều này, tôi thích chỉnh sửa thay đổi / etc / sshd_config của mình:

#PermitUserEnvironment no

đến

PermitUserEnvironment yes

và sau đó tạo tập tin ~ / .ssh / môi trường nếu cần. Người dùng git của tôi có tệp sau trong tệp ~ / .ssh / môi trường của họ:

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

Lưu ý mở rộng biến không xảy ra khi tệp ~ / .ssh / môi trường được đọc như vậy:

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

sẽ không làm việc.


Đây có vẻ là mẹo hoàn hảo, nhưng nó không hoạt động ở đây cho 10.6.6. ssh user @ host echo \ $ PATH vẫn hiển thị đường dẫn xây dựng được mã hóa cứng. Đã thêm .ssh / môi trường với đường dẫn yêu cầu không mở rộng. Đã thay đổi / etc / sshd_config PermitUserEn Môi trường có. không có con xúc xắc. Bất kỳ đề xuất? Cảm ơn.
Bố

Cũng đã thử đặt BASH_ENV = '~ / .nibashrc' trên máy khách và tạo một tệp trong đó với đường dẫn mở rộng trong đó. cũng không có xúc xắc.
Bố

Đồng ý. vì vậy, đặt đường dẫn trong .bashrc trên máy bạn đang kết nối để làm việc cho tôi.
Bố

cảm ơn vì lời khuyên về việc mở rộng biến không hoạt động cho .ssh / môi trường
Denis

Upvote để giải thích rằng mở rộng var không hoạt động.
Xman

7

Giải pháp của Matt không hiệu quả với tôi trên OS X, nhưng Paul's thì có.

Phiên bản ngắn từ liên kết của Paul là:

Được tạo /usr/local/bin/ssh_sessionbằng văn bản sau:

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

Hành hình:

chmod +x /usr/local/bin/ssh_session

Thêm vào như sau /etc/sshd_config:

ForceCommand / usr / local / bin / ssh_session


Thật thú vị khi nghe nó không làm việc cho bạn. Bạn có phiền khi nói PATH trên máy từ xa là gì không, khi bạn chạy "ssh you @ remote \ $ PATH"?
Matt Curtis

7

Đối với bash, nó cần được đưa vào .bashrc chứ không phải .bash_profile (.bash_profile cũng chỉ dành cho shell đăng nhập).


5

Tôi đã gặp những lỗi này với phiên bản MsysGit.

Sau khi làm theo tất cả lời khuyên tôi có thể tìm thấy ở đây và ở nơi khác, tôi đã kết thúc:

cài đặt phiên bản Cygwin của Git

trên máy chủ (Win XP với Cygwin SSHD), điều này cuối cùng đã sửa nó.

Tôi vẫn sử dụng phía máy khách phiên bản MsysGit

.. thực tế, đó là cách duy nhất nó hoạt động với tôi, vì tôi gặp lỗi POSIX với trình kéo Cygwin Git từ cùng máy chủ sshd đó

Tôi nghi ngờ một số công việc vẫn cần thiết cho việc sử dụng Git này .. (ssh + dễ dàng kéo / đẩy trong Windows)


1

Giống như Johan đã chỉ ra nhiều lần .bashrc cần thiết:

ln -s .bash_profile .bashrc


1

Bạn phải thêm

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

trước dòng này trong .bashrc:

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

Nếu không, tất cả các câu lệnh xuất sẽ không được thực thi ( xem tại đây ).


1

Trường hợp của tôi là trên Win 10 với GIT bash và tôi không có GIT theo vị trí tiêu chuẩn. Thay vào đó tôi có git dưới / app / local / bin. Tôi đã sử dụng các lệnh được cung cấp bởi @Garrett nhưng cần thay đổi đường dẫn để bắt đầu bằng double /:

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

Nếu không, GIT sẽ thêm đường dẫn Windows GIT của bạn ở phía trước.


0

Đối với zsh, bạn cần đặt nó trong tệp này: ~ / .zshenv

Ví dụ: trên OS X sử dụng gói git-core từ MacPorts:

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


0

Tôi đã gặp sự cố khi kết nối với repo Gitolite bằng SSH từ Windows và hóa ra vấn đề của tôi là XIN L! I! Nó cứ hỏi tôi mật khẩu, nhưng ssh gitolite @ [host] sẽ trả lại danh sách repo tốt.

Kiểm tra biến môi trường của bạn: GIT_SSH. Nếu nó được đặt thành Plink, thì hãy thử nó mà không có bất kỳ giá trị nào ("đặt GIT_SSH =") và xem nếu nó hoạt động.


0

Thêm vị trí của bạn git-upload-packvào tệp .bashrc của người dùng từ xa.


0

Nó có thể đơn giản như cài đặt git trên máy chủ từ xa (giống như trong trường hợp của tôi).

sudo apt-get install git

Hoặc tương đương cho các hệ thống quản lý gói khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.