タイトルが示すように、私はプライベート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
これは、認証なしでプライベートリポジトリにアクセスしようとしているためだと思います。そのため、私はGit + ssh
を使って、pipが私のSSH公開鍵を使って認証することを望んでいます。
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
私が達成しようとしていることは可能でさえありますか?もしそうなら、どうすればそれができますか?
git+ssh
URIスキームを使用できますが、usernameを設定する必要があります。
pip install git+ssh://[email protected]/echweb/echweb-utils.git
URIのgit@
部分を参照してください。
PS: キーのデプロイ についても読んでください。
PPS:私のインストールでは、 "git + ssh" URIスキームは "編集可能"な要件でのみ動作します。
pip install -e URI#Egg=EggName
覚えておいてください:pip
コマンドでリモートのアドレスを使用する前に、:
が印刷するgit remote -v
文字を/
文字に変更してください。
$ git remote -v
Origin [email protected]: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
追加の手法として、プライベートリポジトリをローカルにクローンしている場合は、次の操作を実行できます。
pip install git+file://c:/repo/directory
編集:より現代的には、これを行うことができます(そして-e
は変更が反映される前に変更をコミットする必要がないことを意味します)。
pip install -e C:\repo\directory
このようにHTTPSのURLを使って直接行うことができます。
pip install git+https://github.com/username/repo.git
これは、例えばDjangoプロジェクトのRequirements.txtにその行を追加するだけでも機能します。
Bitbucketでも動作します。
pip install git+ssh://[email protected]/username/projectname.git
この場合、PipはあなたのSSH鍵を使用します。
要件ファイルの構文は次のとおりです。
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
インストールしたいだけなら。
私はSSH鍵よりもトークンを使うほうがずっと簡単だとわかりました。私はこれについてあまり良いドキュメントを見つけることができなかったので、主に試行錯誤を通してこの解決策に出会いました。さらに、pip&setuptoolsからのインストールには微妙な違いがいくつかあります。しかし、この方法は両方に有効です。
GitHubは(現在、2016年8月現在)プライベートリポジトリのZip/tarballを取得する簡単な方法を提供していません。それで、あなたはsetuptoolsを指して、あなたがgitリポジトリを指していることをsetuptoolsに伝える必要があります。
from setuptools import setup
import os
# get 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)
]
ここでいくつかのメモ:
0
です)を含める必要があります。これはWordではなく実際の数字である必要があります。git+
を先頭に付ける必要があります。version
は、ブランチ、タグ、またはコミットハッシュです。--process-dependency-links
を提供する必要があります。パスワードの入力を要求しないGitLabプライベートリポジトリを自動的に「ピップインストール」する方法を考え出しました。このアプローチではGitLabの「キーのデプロイ」とSSH設定ファイルを使用するので、個人のSSHキー以外のキーを使用してデプロイすることができます(私の場合は「bot」で使用します)。おそらく誰かが親切な魂がGitHubを使って検証することができます。
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の[キーの配置]ダイアログに貼り付けます。
次のコマンドはSSHに新しいデプロイキーを使用して接続を設定するように指示します。成功すると、「GitLabへようこそ、UserName!」というメッセージが表示されます。
ssh -T -i ~/.ssh/GitLab_Robot_Deploy_Key [email protected]
次に、エディタを使って~/.ssh/config
ファイルを作成します。以下の内容を追加してください。 'Host'の値は、あなたが望むものなら何でもかまいません(後でそれを使うことになるので、ただ覚えておいてください)。 HostNameはGitLabインスタンスへのURLです。 IdentifyFileは、最初のステップで作成したSSH鍵ファイルへのパスです。
Host GitLab
HostName gitlab.mycorp.com
IdentityFile ~/.ssh/GitLab_Robot_Deploy_Key
@ oxyum SSHでpipを使うためのレシピを教えてくれました:
pip install git+ssh://[email protected]/my_name/my_repo.git
SSHで新しいデプロイキーを使用するようにするには、少し修正する必要があります。これを行うには、SSH設定ファイルのHostエントリをSSHでポイントします。コマンドの 'gitlab.mycorp.com'をSSH設定ファイルで使用したホスト名に置き換えてください。
pip install git+ssh://git@GitLab/my_name/my_repo.git
これでパッケージはパスワードなしのプロンプトでインストールされます。
私がgithubからインストールしていたとき、私は使うことができました:
pip install git+ssh://[email protected]/<username>/<projectname>.git#Egg=<eggname>
しかし、私はSudo
としてpipを実行しなければならなかったので、SSHキーはもうgithubで動作していませんでした、「git clone」は「Permission denied(publickey)」で失敗しました。 git+https
を使うことで私はSudoとしてコマンドを実行することができ、そしてgithubに私のユーザ/パスワードを尋ねてもらうことができました。
Sudo pip install git+https://github.com/<username>/<projectname>.git#Egg=<eggname>
また、 git + https://github.com/... のURLを使ってプライベートなリポジトリ依存関係をインストールすることもできます。 .netrc
ファイルで curl の場合は(またはトークンを展開します。)
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"
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}
を使いました。
この方法には明らかな利点があります。あなたはすべての依存関係を含む単一の要件ファイルを持っています。
oxyum's 解決策はこの答えには大丈夫です。キーもrootに格納する必要があるのでSudo
を使ってインストールする場合は注意が必要です(例:/root/.ssh
)。
それからあなたはタイプすることができます
Sudo pip install git+ssh://[email protected]/echweb/echweb-utils.git
Sshを使いたくない場合は、httpsのURLにユーザー名とパスワードを追加できます。
以下のコードは、あなたがあなたのパスワードを含む作業ディレクトリに "pass"と呼ばれるファイルがあると仮定しています。
export PASS=$(cat pass)
pip install git+https://<username>:[email protected]/echweb/echweb-utils.git
Github/gitlabなどに独自のライブラリ/パケットがある場合は、具体的なバージョンのライブラリでコミットするタグを追加する必要があります。 v2.0あなたはあなたのパケットをインストールすることができます
pip install git+ssh://link/name/[email protected]
これは私のために働きます。他の解決策は私のために働いていませんでした。