Có thể sử dụng pip để cài đặt gói từ kho lưu trữ GitHub riêng không?


349

Tôi đang cố gắng cài đặt gói Python từ kho lưu trữ GitHub riêng. Đối với một kho lưu trữ công cộng, tôi có thể ban hành lệnh sau hoạt động tốt:

pip install git+git://github.com/django/django.git

Tuy nhiên, nếu tôi thử điều này cho một kho lưu trữ riêng tư:

pip install git+git://github.com/echweb/echweb-utils.git

Tôi nhận được đầu ra sau đây:

Downloading/unpacking git+git://github.com/echweb/echweb-utils.git
Cloning Git repository git://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build
Complete output from command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build:
fatal: The remote end hung up unexpectedly

Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build...

----------------------------------------
Command /usr/local/bin/git clone git://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-VRsIoo-build failed with error code 128

Tôi đoán điều này là do tôi đang cố gắng truy cập vào một kho lưu trữ riêng mà không cung cấp bất kỳ xác thực nào. Do đó, tôi đã cố gắng sử dụng Git + với sshhy vọng rằng pip sẽ sử dụng khóa chung SSH của tôi để xác thực:

pip install git+ssh://github.com/echweb/echweb-utils.git

Điều này cho đầu ra sau:

Downloading/unpacking git+ssh://github.com/echweb/echweb-utils.git
Cloning Git repository ssh://github.com/echweb/echweb-utils.git to /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build
Complete output from command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build:
Cloning into /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build...

Permission denied (publickey).

fatal: The remote end hung up unexpectedly

----------------------------------------
Command /usr/local/bin/git clone ssh://github.com/echweb/echweb-utils.git /var/folders/cB/cB85g9P7HM4jcPn7nrvWRU+++TI/-Tmp-/pip-DQB8s4-build failed with error code 128

Là những gì tôi đang cố gắng để đạt được thậm chí có thể? Nếu vậy, làm thế nào tôi có thể làm điều đó?


2
Đây chắc chắn không phải là câu trả lời chính xác, nhưng nhân bản repo bằng tay sau đó trỏ pip vào localhost thay vì github sẽ giúp bạn vượt qua điều này nếu bạn chỉ đang cố gắng làm việc hiệu quả.
nmichaels

@nmicheals Đó là những gì tôi đã làm cho đến nay, nhưng tôi cần đưa điều này vào các tệp yêu cầu để triển khai trên nhiều trang web với các virtualenv riêng biệt.
Adam J. Forster

Chỉ để anh ấy chắc chắn: bạn đã thiết lập hỗ trợ khóa ssh trên github, phải không? Nếu điều đó chắc chắn không hoạt động .... Bạn đã thử sử dụng git + git: // user: pass@github.com / .... làm URI chưa?
Jason LeBrun

Hãy thử sử dụng eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsavà sau đó chạy cài đặt pip sau pip.pypa.io/en/urdy/reference/pip_install/#git
Darren Weber

Câu trả lời:


375

Bạn có thể sử dụng git+sshlược đồ URI, nhưng bạn phải đặt tên người dùng:

pip install git+ssh://git@github.com/echweb/echweb-utils.git

Bạn có thấy git@phần vào URI không?

PS: Cũng đọc về các khóa triển khai .

PPS: Trong cài đặt của tôi, lược đồ URI "git + ssh" chỉ hoạt động với các yêu cầu "có thể chỉnh sửa":

pip install -e URI#egg=EggName

Ghi nhớ : Thay đổi :ký tự git remote -vin thành /ký tự trước khi sử dụng địa chỉ của điều khiển từ xa trong piplệnh:

$ git remote -v
origin  git@github.com:echweb/echweb-utils.git (fetch)
                      ^ change this to a '/' character

Nếu bạn quên, bạn sẽ gặp lỗi này:

ssh: Could not resolve hostname github.com:echweb:
         nodename nor servname provided, or not known

3
Cảm ơn vì điều đó, tôi chỉ thiếu phần git @. Ngẫu nhiên, lệnh 'pip install git + ssh: //git@github.com/echweb/echweb-utils.git' đã hoạt động, tôi không yêu cầu chuyển đổi -e.
Adam J. Forster

2
bạn cũng có thể sử dụng tệp .ssh / config để đặt tên người dùng phù hợp
Stefano

2
Điều này đã từng làm việc cho tôi nhưng bây giờ thì không, tôi thậm chí còn sử dụng git+ssh://git@github.com/echweb/echweb-utils.gitlược đồ chính xác trong tệp yêu cầu của mình. Tôi đã mở một câu hỏi mới ở đây: stackoverflow.com/questions/18883430/ . Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời.
Robeezy

2
Hoàn hảo. Đưa git+ssh://git@github.com/echweb/echweb-utils.gitvào requirements.txtcông việc quá, đó là tuyệt vời.
Avindra Goolcharan

2
Nếu bạn muốn cài đặt từ một chi nhánh cụ thể:pip install git+ssh://git@github.com/echweb/echweb-utils.git@branch-name
Guilherme Beltramini

73

Là một kỹ thuật bổ sung, nếu bạn có kho lưu trữ riêng được nhân bản cục bộ, bạn có thể thực hiện:

pip install git+file://c:/repo/directory

Hiện đại hơn, bạn chỉ có thể làm điều này (và -esẽ có nghĩa là bạn không phải thực hiện các thay đổi trước khi chúng được phản ánh):

pip install -e C:\repo\directory

9
Điều này khá hữu ích. Rõ ràng, những thay đổi cục bộ phải là git-commit'd trước khi chúng có thể được cài đặt qua pip.
ramhiser

5
Điều đó đúng - nó lấy nó từ kho git (trong .git), KHÔNG phải là bản sao làm việc của các tệp.
Scott Stafford

47

Bạn có thể làm điều đó trực tiếp với URL HTTPS như thế này:

pip install git+https://github.com/username/repo.git

Điều này cũng hoạt động chỉ là nối thêm dòng đó trong tệp.txt.txt trong dự án Django .


19
Tuy nhiên, đối với các repos riêng, điều này sẽ kích hoạt lời nhắc tên người dùng / mật khẩu trên bảng điều khiển, đây có thể không phải là điều bạn muốn.
rascalking

31

Nó cũng hoạt động với Bitbucket :

pip install git+ssh://git@bitbucket.org/username/projectname.git

Pip sẽ sử dụng các khóa SSH của bạn trong trường hợp này.


15

Cú pháp cho tệp yêu cầu được đưa ra ở đây:

https://pip.pypa.io/en/latest/reference/pip_install.html#requirements-file-format

Vì vậy, ví dụ, sử dụng:

-e git+http://github.com/rwillmer/django-behave#egg=django-behave

nếu bạn muốn nguồn dính xung quanh sau khi cài đặt.

Hoặc chỉ

git+http://github.com/rwillmer/django-behave#egg=django-behave

nếu bạn chỉ muốn nó được cài đặt.


URL cho cú pháp tệp yêu cầu đã thay đổi. URL mới là: pip.pypa.io/en/latest/reference/ từ
hình cầu

15

Tôi thấy việc sử dụng mã thông báo dễ dàng hơn nhiều so với khóa SSH. Tôi không thể tìm thấy nhiều tài liệu tốt về điều này, vì vậy tôi đã tìm thấy giải pháp này chủ yếu thông qua thử nghiệm và lỗi. Hơn nữa, cài đặt từ pip và setuptools có một số khác biệt tinh tế; nhưng cách này nên làm việc cho cả hai.

GitHub không (hiện tại, kể từ tháng 8 năm 2016) cung cấp một cách dễ dàng để có được zip / tarball của các kho riêng. Vì vậy, bạn cần trỏ các công cụ thiết lập để thông báo cho các công cụ thiết lập rằng bạn đang trỏ đến kho lưu trữ Git:

from setuptools import setup
import os
# Get the deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ]

Một vài lưu ý ở đây:

  • Đối với các kho riêng, bạn cần xác thực với GitHub; cách đơn giản nhất mà tôi tìm thấy là tạo mã thông báo OAuth , thả mã đó vào môi trường của bạn và sau đó đưa nó vào URL
  • Bạn cần bao gồm một số số phiên bản (ở đây 0) ở cuối liên kết, ngay cả khi không có gói nào trên PyPI . Đây phải là một con số thực tế, không phải là một từ.
  • Bạn cần phải mở đầu bằng git+cách nói với các công cụ thiết lập để sao chép kho lưu trữ, thay vì chỉ vào một zip / tarball
  • version có thể là một nhánh, một thẻ hoặc một hàm băm
  • Bạn cần cung cấp --process-dependency-linksnếu cài đặt từ pip

1
Lưu ý setup.pykhông nên chứa các phụ thuộc cụ thể, chỉ những cái trừu tượng. Đây là chỉ định một phụ thuộc cụ thể vào setup.py.
Jorge Leitao

1
Với việc phát hành phiên bản pip 19.0, tùy chọn - liên kết phụ thuộc quy trình không được chấp nhận.
yardstick17

14

Tôi đã tìm ra một cách để tự động 'cài đặt pip' một kho lưu trữ riêng GitLab không yêu cầu nhắc mật khẩu. Cách tiếp cận này sử dụng "Khóa triển khai" của GitLab và tệp cấu hình SSH, do đó bạn có thể triển khai bằng các khóa khác với khóa SSH cá nhân của mình (trong trường hợp của tôi, để sử dụng bởi 'bot). Có lẽ ai đó có thể xác minh bằng cách sử dụng GitHub.

Tạo khóa SSH mới:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

Các tập tin sẽ hiển thị như ~/.ssh/GitLab_Robot_Deploy_Key~/.ssh/GitLab_Robot_Deploy_Key.pub.

Sao chép và dán nội dung của ~/.ssh/GitLab_Robot_Deploy_Key.pubtệp vào hộp thoại "Khóa triển khai" của GitLab.

Kiểm tra khóa triển khai mới

Lệnh sau cho SSH sử dụng khóa triển khai mới của bạn để thiết lập kết nối. Khi thành công, bạn sẽ nhận được thông báo: "Chào mừng bạn đến với GitLab, Tên người dùng!"

ssh -T -i ~/.ssh/GitLab_Robot_Deploy_Key git@gitlab.mycorp.com

Tạo tệp cấu hình SSH

Tiếp theo, sử dụng một trình soạn thảo để tạo một ~/.ssh/configtập tin. Thêm các nội dung sau. Giá trị 'Máy chủ' có thể là bất cứ thứ gì bạn muốn (chỉ cần nhớ nó, vì bạn sẽ sử dụng nó sau). Tên máy chủ là URL tới ví dụ GitLab của bạn. IdentifyFile là đường dẫn đến tệp khóa SSH mà bạn đã tạo ở bước đầu tiên.

Host GitLab
  HostName gitlab.mycorp.com
  IdentityFile ~/.ssh/GitLab_Robot_Deploy_Key

Trỏ SSH vào tệp Cấu hình

oxyum đã cho chúng tôi công thức sử dụng pip với SSH:

pip install git+ssh://git@gitlab.mycorp.com/my_name/my_repo.git

Chúng tôi chỉ cần sửa đổi một chút để SSH sử dụng Khóa triển khai mới của chúng tôi. Chúng tôi thực hiện điều đó bằng cách trỏ SSH vào mục Máy chủ trong tệp cấu hình SSH. Chỉ cần thay thế 'gitlab.mycorp.com' trong lệnh thành tên máy chủ chúng tôi đã sử dụng trong tệp cấu hình SSH:

pip install git+ssh://git@GitLab/my_name/my_repo.git

Các gói nên cài đặt mà không cần bất kỳ dấu nhắc mật khẩu.

Tài liệu tham khảo A
Tài liệu tham khảo B


7

Khi tôi cài đặt từ GitHub, tôi đã có thể sử dụng:

pip install git+ssh://git@github.com/<username>/<projectname>.git#egg=<eggname>

Nhưng, vì tôi phải chạy pip sudo, các khóa SSH không còn hoạt động với GitHub nữa và "git clone" đã thất bại trong "Quyền bị từ chối (khóa công khai)". Việc sử dụng git+httpscho phép tôi chạy lệnh dưới dạng sudo và yêu cầu GitHub hỏi tôi về mật khẩu / người dùng của tôi.

sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>

Các tài khoản người dùng khác có cần truy cập vào dự án của bạn không? Nếu không, bạn đã phát hiện ra đề nghị của nerdwaller chưa?
Michael - Clay Shirky ở đâu

7

Bạn cũng có thể cài đặt một phụ thuộc kho lưu trữ riêng thông qua git + https: //github.com / ... URL bằng cách cung cấp thông tin đăng nhập (đăng nhập và mật khẩu hoặc mã thông báo triển khai) để cuộn tròn với .netrctệp:

echo "machine github.com login ei-grad password mypasswordshouldbehere" > ~/.netrc
pip install "git+https://github.com/ei-grad/my_private_repo.git#egg=my_private_repo"

5

Nếu bạn muốn cài đặt các phụ thuộc từ tệp yêu cầu trong máy chủ CI hoặc tương tự, bạn có thể thực hiện việc này:

git config --global credential.helper 'cache'
echo "protocol=https
host=example.com
username=${GIT_USER}
password=${GIT_PASS}
" | git credential approve
pip install -r requirements.txt

Trong trường hợp của tôi, tôi đã sử dụng GIT_USER=gitlab-ci-tokenGIT_PASS=${CI_JOB_TOKEN}.

Phương pháp này có một lợi thế rõ ràng. Bạn có một tệp yêu cầu duy nhất chứa tất cả các phụ thuộc của bạn.


3

Nếu bạn không muốn sử dụng SSH, bạn có thể thêm tên người dùng và mật khẩu trong URL HTTPS.

Mã dưới đây giả sử rằng bạn có một tệp gọi là "pass" trong thư mục làm việc có chứa mật khẩu của bạn.

export PASS=$(cat pass)
pip install git+https://<username>:$PASS@github.com/echweb/echweb-utils.git

0

Giải pháp của oxyum là OK cho câu trả lời này. Tôi chỉ muốn chỉ ra rằng bạn cần phải cẩn thận nếu bạn đang cài đặt bằng cách sử dụng sudocác khóa cũng phải được lưu trữ cho root (ví dụ, /root/.ssh).

Sau đó, bạn có thể gõ

sudo pip install git+ssh://git@github.com/echweb/echweb-utils.git

6
Giải pháp dễ dàng: không cài đặt với sudo. Thay vào đó sử dụng --usercờ hoặc virtualenv.
nerdwaller

0

Nếu bạn có thư viện / gói riêng trên GitHub, GitLab, v.v., bạn phải thêm thẻ để cam kết với phiên bản cụ thể của thư viện, ví dụ: v2.0, sau đó bạn có thể cài đặt gói của mình:

pip install git+ssh://link/name/repo.git@v2.0

Điều này làm việc cho tôi. Các giải pháp khác đã không làm việc cho tôi.


0

Đây là một phương pháp nhanh chóng hiệu quả với tôi. Chỉ cần rẽ nhánh repo và cài đặt nó từ tài khoản GitHub của riêng bạn với

pip install git+https://github.com/yourName/repoName

-1

Chỉ cần sao chép điều khiển từ git clonelệnh gốc (hoặc từ git remote -v). Bạn sẽ nhận được một cái gì đó như thế này:

  • Cai Xô nhỏ: git+ssh://git@bitbucket.org:your_account/my_pro.git

  • GitHub: git+ssh://git@github.com:your_account/my_pro.git

Tiếp theo, bạn cần thay thế :bằng /bên cạnh tên miền.

Vì vậy, cài đặt bằng cách sử dụng:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git

Bạn có ý nghĩa gì bởi "sao chép lệnh git clone" ? Bạn có nghĩa là "sao chép bằng lệnh 'git clone'" ? Hoặc "sao chép lệnh 'git clone' ? Hay cái gì khác? (Vui lòng trả lời bằng cách chỉnh sửa câu trả lời của bạn , không phải ở đây trong các bình luận (nếu thích hợp). Cảm ơn trước.).
Peter Mortensen

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.