pipを使用してプライベートGitHubリポジトリからパッケージをインストールすることはできますか?


349

プライベートGitHubリポジトリからPythonパッケージをインストールしようとしています。パブリックリポジトリの場合、正常に機能する次のコマンドを発行できます。

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

ただし、プライベートリポジトリにこれを試した場合:

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

次の出力が表示されます。

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

これは、認証を提供せずにプライベートリポジトリにアクセスしようとしているためだと思います。したがってssh、pipがSSH公開鍵を使用して認証されることを期待して、Git +を使用しようとしました。

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

これにより、次の出力が得られます。

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

私が達成しようとしていることは可能ですか?もしそうなら、どうすればそれを行うことができますか?


2
それは確かに正しい答えではありませんが、リポジトリを手動で複製し、githubの代わりにlocalhostにpipをポイントすると、生産性を高めようとしているだけなら、これを回避できます。
nmichaels 2011年

@nmichealsこれまでのところ、これを行っていますが、個別のvirtualenvを使用して多くのWebサイトに展開するために、これを要件ファイルに含める必要があります。
Adam J. Forster

念のために言っておきますが、すでにgithubにsshキーのサポートを設定していますよね?それが確実に機能しない場合... URIとしてgit + git:// user:pass@github.com / ....を使用してみましたか?
Jason LeBrun、2011年

使用eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsaしてみて、pip.pypa.io / en / stable / reference / pip_install /#git
Darren Weber

回答:


375

git+sshURIスキームを使用できますが、ユーザー名を設定する必要があります。

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

git@URI の一部が見えますか?

PS:デプロイキーについてもお読みください。

PPS:私のインストールでは、「git + ssh」URIスキームは「編集可能な」要件でのみ機能します。

pip install -e URI#egg=EggName

覚えておいてください:コマンドでリモートのアドレスを使用する前に、印刷する:文字を文字に変更してくださいgit remote -v/pip

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

忘れると、次のエラーが発生します。

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

3
そのおかげで、私はgit @の部分が欠けていました。ちなみに、 'pip install git + ssh://git@github.com/echweb/echweb-utils.git'コマンドは機能しましたが、-eスイッチは必要ありませんでした。
アダムJ.フォースター2011年

2
.ssh / configファイルを使用して適切なユーザー名を設定することもできます
Stefano

2
これは以前は機能していましたが、今は機能していませんgit+ssh://git@github.com/echweb/echweb-utils.git。要件ファイルで正しいスキームを使用しています。ここに新しい質問を開きました:stackoverflow.com/questions/18883430/…。どんな助けでも素晴らしいでしょう。
Robeezy 2013

2
完璧です。パッティングgit+ssh://git@github.com/echweb/echweb-utils.gitrequirements.txt素晴らしいである、あまりにも動作します。
Avindra Goolcharan、2016

2
特定のブランチからインストールする場合:pip install git+ssh://git@github.com/echweb/echweb-utils.git@branch-name
Guilherme Beltramini 2017年

73

追加の手法として、ローカルにプライベートリポジトリのクローンを作成している場合は、次のことができます。

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

より現代的には、これを行うことができます(-e変更が反映される前に変更をコミットする必要がないことを意味します)。

pip install -e C:\repo\directory

9
これは非常に役に立ちました。どうやら、ローカルの変更は、pip経由でインストールする前にgit-commitする必要があります。
ramhiser 2013年

5
それは本当です-それはファイルの作業用コピーではなく、gitリポジトリ(.git内)から取得しています。
スコットスタッフォード

47

次のようなHTTPS URLで直接実行できます。

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

これは、たとえばDjangoプロジェクトのrequirements.txtにその行を追加するだけでも機能します。


19
ただし、プライベートリポジトリの場合、これによりコンソールにユーザー名/パスワードのプロンプトが表示されますが、これはおそらく望ましいことではありません。
2017

31

Bitbucketでも動作します:

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

この場合、PipはSSHキーを使用します。


15

要件ファイルの構文は次のとおりです。

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

たとえば、次のようにします。

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

インストール後にソースを固定したい場合。

あるいは単に

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

インストールしたいだけの場合。


要件ファイル構文のURLが変更されました。新しいURLは次のとおり
sphere

15

SSHキーよりもトークンを使用する方がはるかに簡単です。これに関する適切なドキュメントがあまり見つからなかったため、主に試行錯誤によってこの解決策を見つけました。さらに、pipとsetuptoolsからのインストールには、微妙な違いがあります。しかし、この方法は両方で機能するはずです。

GitHubは(現在、2016年8月現在)、プライベートリポジトリのzip / tarballを取得する簡単な方法を提供していません。したがって、setuptoolsをポイントして、Gitリポジトリをポイントしていることをsetuptoolsに伝える必要があります。

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)
        ]

ここにいくつかのメモ:

  • プライベートリポジトリの場合、GitHubで認証する必要があります。私が見つけた最も簡単な方法は、OAuthトークンを作成して環境にドロップし、それをURLに含めることです
  • あなたは含める必要があり、いくつかのバージョン番号(ここではあるが0あります場合でも、リンクの終わりには)上の任意のパッケージではありませんは、PyPI。これは単語ではなく、実際の番号である必要があります。
  • git+setuptoolsにzip / tarballを指すのではなく、リポジトリのクローンを作成することを伝えるために前書きを付ける必要があります。
  • version ブランチ、タグ、またはコミットハッシュにすることができます
  • --process-dependency-linkspipからインストールする場合は、供給する必要があります

1
注にsetup.pyは、具体的な依存関係のみを含め、具体的な依存関係は含めないでください。これはに対する具体的な依存関係を指定していsetup.pyます。
Jorge Leitao

1
pipバージョン19.0のリリースに伴い、-process-dependency-linksオプションは非推奨になりました。
yardstick17

14

パスワードプロンプトを必要としないGitLabプライベートリポジトリを自動的に「pipインストール」する方法を見つけました。このアプローチでは、GitLabの「キーのデプロイ」とSSH構成ファイルを使用するため、個人のSSHキー以外のキーを使用してデプロイできます(私の場合は「ボット」で使用)。たぶん、親切な人がGitHubを使用して確認できるでしょう。

新しいSSHキーを作成します。

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

ファイルは~/.ssh/GitLab_Robot_Deploy_Keyおよびとして表示され~/.ssh/GitLab_Robot_Deploy_Key.pubます。

~/.ssh/GitLab_Robot_Deploy_Key.pubファイルの内容をコピーして、GitLabの[Deploy Keys]ダイアログに貼り付けます。

新しい展開キーをテストする

次のコマンドは、新しいデプロイキーを使用して接続を設定するようにSSHに指示します。成功すると、「GitLabへようこそ、ユーザー名!」というメッセージが表示されます。

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

SSH構成ファイルを作成する

次に、エディターを使用して~/.ssh/configファイルを作成します。以下の内容を追加します。'Host'の値は自由に設定できます(後で使用するため、覚えておいてください)。HostNameは、GitLabインスタンスへのURLです。IdentifyFileは、最初の手順で作成したSSHキーファイルへのパスです。

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

SSHに構成ファイルを指定する

oxyumは SSHでpipを使用するためのレシピを提供してくれまし

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

SSHに新しい展開キーを使用させるには、少し変更する必要があります。それには、SSHをSSH構成ファイルのHostエントリにポイントします。コマンドの「gitlab.mycorp.com」をSSH構成ファイルで使用したホスト名に置き換えるだけです。

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

これで、パッケージはパスワードプロンプトなしでインストールされます。

リファレンスA
リファレンスB


7

私がGitHubからインストールしていたとき、私は使うことができました:

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

しかし、pipをとして実行する必要があったためsudo、SSHキーはGitHubで動作しなくなり、「git clone」は「Permission denied(publickey)」で失敗しました。を使用git+httpsすると、コマンドをsudoとして実行でき、GitHubでユーザー/パスワードを尋ねられます。

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

他のユーザーアカウントがプロジェクトにアクセスする必要がありますか?そうでない場合、オタクの提案
マイケル-クレイシャーキーはどこですか

7

次のファイルを使用してcurlのログイン認証情報(ログインとパスワード、またはデプロイトークン)を提供することで、git + https://github.com / ... URL を介してプライベートリポジトリ依存関係をインストールすることもできます。.netrc

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

CIサーバー内の要件ファイルなどから依存関係をインストールする場合は、次のようにします。

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

私の場合、とを使用GIT_USER=gitlab-ci-tokenしましたGIT_PASS=${CI_JOB_TOKEN}

この方法には明らかな利点があります。すべての依存関係を含む単一の要件ファイルがあります。


3

SSHを使用しない場合は、HTTPS URLにユーザー名とパスワードを追加できます。

以下のコードは、パスワードを含む作業ディレクトリに「pass」というファイルがあることを前提としています。

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

0

oxyumのソリューションは、この答えには問題ありませんsudoルート用にもキーを保存する必要があるため(たとえば/root/.ssh)、を使用してインストールする場合は注意が必要であることを指摘しておきます。

それからあなたはタイプすることができます

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

6
簡単な解決策:sudoをインストールしないでください。代わりに、--userフラグまたはvirtualenvを使用してください。
nerdwaller

0

GitHub、GitLabなどに独自のライブラリ/パッケージがある場合は、v2.0などのライブラリの具体的なバージョンでコミットするタグを追加する必要があります。その後、パッケージをインストールできます。

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

これでうまくいきます。他の解決策ではうまくいきませんでした。


0

ここに私のために働いた簡単な方法があります。単にリポジトリをフォークして、自分のGitHubアカウントからインストールします。

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

-1

元のgit cloneコマンド(またはgit remote -v)からリモートをコピーするだけです。あなたはこのようなものを得るでしょう:

  • Bitbucket: git+ssh://git@bitbucket.org:your_account/my_pro.git

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

次に、あなたは交換する必要がある:/ドメイン名の隣にあります。

だからインストールしてください:

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

「copy git clone command」とはどういう意味ですか?「git cloneコマンドを使用してコピーするという意味ですか?または「「git clone」コマンドをコピーしますか?または、他の何か?(ここではコメントで(適切な場合)ではなく、回答を編集して返信してください。よろしくお願いします。)
Peter Mortensen

-2

あなたは試すことができます

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

なしssh:...。それは私にとってはうまくいきます。


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