É possível usar o pip para instalar um pacote de um repositório privado do GitHub?

349

Estou tentando instalar um pacote Python a partir de um repositório GitHub privado. Para um repositório público, posso emitir o seguinte comando que funciona bem:

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

No entanto, se eu tentar isso para um repositório privado:

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

Eu recebo a seguinte saída:

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

Acho que é porque estou tentando acessar um repositório privado sem fornecer nenhuma autenticação. Portanto, tentei usar o Git + sshesperando que o pip usasse minha chave pública SSH para autenticar:

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

Isso fornece a seguinte saída:

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

O que estou tentando alcançar é possível? Se sim, como posso fazer isso?

Adam J. Forster
fonte
2
Certamente não é a resposta correta, mas clonar o repositório manualmente e depois apontar pip para o host local em vez do github fará com que você passe por isso se você estiver apenas tentando ser produtivo.
Nmichaels
@nmicheals Foi o que fiz até agora, mas preciso colocar isso em arquivos de requisitos para implantação em muitos sites, todos com virtualenvs separados.
Adam J. Forster
Só para ter certeza: você já configurou o suporte a ssh key no github, certo? Se isso definitivamente não está funcionando ... Você já tentou usar git + git: // usuário: [email protected] / .... como o URI?
Jason LeBrun
Tente usar eval $(ssh-agent); ssh-add ~/.ssh/github_id_rsae, em seguida, pip executar instala seguinte pip.pypa.io/en/stable/reference/pip_install/#git
Darren Weber

Respostas:

375

Você pode usar o git+sshesquema de URI, mas deve definir um nome de usuário:

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

Você vê a git@parte no URI?

PS: Leia também sobre as chaves de implantação .

PPS: Na minha instalação, o esquema de URI "git + ssh" funciona apenas com os requisitos "editáveis":

pip install -e URI#egg=EggName

Lembre - se : Altere o :caractere que é git remote -vimpresso em um /caractere antes de usar o endereço do controle remoto no pipcomando:

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

Se você esquecer, você receberá este erro:

ssh: Could not resolve hostname github.com:echweb:
         nodename nor servname provided, or not known
oxyum
fonte
3
Obrigado por isso, estava faltando a parte git @. Aliás, o comando 'pip install git + ssh: //[email protected]/echweb/echweb-utils.git' funcionou, eu não exigi a opção -e.
Adam J. Forster
2
você também pode usar um arquivo .ssh / config para definir o nome de usuário adequado
Stefano
2
Isso costumava funcionar para mim, mas agora não está, estou usando o git+ssh://[email protected]/echweb/echweb-utils.gitesquema correto no meu arquivo de requisitos. Abri uma nova pergunta aqui: stackoverflow.com/questions/18883430/… . Qualquer ajuda seria ótimo.
precisa saber é o seguinte
2
Perfeito. Colocar git+ssh://[email protected]/echweb/echweb-utils.gitem requirements.txttrabalhos também, o que é incrível.
Avindra Goolcharan
2
Se você deseja instalar a partir de um ramo específico:pip install git+ssh://[email protected]/echweb/echweb-utils.git@branch-name
Guilherme Beltramini 27/06
73

Como uma técnica adicional, se você tiver o repositório privado clonado localmente, poderá:

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

De maneira mais moderna, você pode fazer isso (e -eisso significa que você não precisa confirmar as alterações antes que elas reflitam):

pip install -e C:\repo\directory
Scott Stafford
fonte
9
Isso foi bastante útil. Aparentemente, as alterações locais precisam ser confirmadas pelo git antes de poderem ser instaladas via pip.
ramhiser
5
Isso é verdade - está sendo retirado do repositório git (em .git), NÃO das cópias de trabalho dos arquivos.
Scott Stafford
47

Você pode fazer isso diretamente com a URL HTTPS desta forma:

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

Isso também funciona apenas acrescentando essa linha no requirements.txt em um projeto Django , por exemplo.

danius
fonte
19
Para repositórios particulares, no entanto, isso acionará um prompt de nome de usuário / senha no console, o que provavelmente não é o que você deseja.
rascalking
31

Também funciona com o Bitbucket :

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

Pip usará suas chaves SSH neste caso.

gnrfan
fonte
15

A sintaxe para o arquivo de requisitos é fornecida aqui:

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

Então, por exemplo, use:

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

se você quiser que a fonte permaneça após a instalação.

Ou apenas

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

se você apenas deseja que ele seja instalado.

Rachel
fonte
O URL para a sintaxe do arquivo de requisitos foi alterado. O novo URL é: pip.pypa.io/en/latest/reference/…
sphere
15

Achei muito mais fácil usar tokens do que chaves SSH. Como não encontrei muita documentação boa sobre isso, encontrei essa solução principalmente por tentativa e erro. Além disso, a instalação do pip e setuptools possui algumas diferenças sutis; mas dessa maneira deve funcionar para ambos.

O GitHub (atualmente, a partir de agosto de 2016) não oferece uma maneira fácil de obter o zip / tarball de repositórios privados. Então, você precisa apontar setuptools para dizer ao setuptools que você está apontando para um repositório 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)
        ]

Algumas notas aqui:

  • Para repositórios particulares, você precisa se autenticar no GitHub; a maneira mais simples que encontrei é criar um token OAuth , soltá-lo em seu ambiente e incluí-lo no URL
  • Você precisa incluir algum número de versão (aqui está 0) no final do link, mesmo se não houver nenhum pacote no PyPI . Este deve ser um número real, não uma palavra.
  • Você precisa git+usar o prefácio para dizer ao setuptools que é para clonar o repositório, em vez de apontar para um zip / tarball
  • version pode ser uma ramificação, uma tag ou um hash de confirmação
  • Você precisa fornecer --process-dependency-linksse estiver instalando a partir do pip
Maximilian
fonte
11
A nota setup.pynão deve conter dependências concretas, apenas abstratas. Isso está especificando uma dependência concreta setup.py.
Jorge Leitao
11
Com o lançamento da versão 19.0 do pip, a opção --process-dependency-links está obsoleta.
yardstick17
14

Eu descobri uma maneira de instalar automaticamente o pip de um repositório privado do GitLab que não requer prompt de senha. Essa abordagem usa o GitLab "Deploy Keys" e um arquivo de configuração SSH, para que você possa implantar usando outras chaves além das suas chaves SSH pessoais (no meu caso, para uso por um 'bot). Talvez alguém que seja gentil pode verificar usando o GitHub.

Crie uma nova chave SSH:

ssh-keygen -t rsa -C "GitLab_Robot_Deploy_Key"

O arquivo deve aparecer como ~/.ssh/GitLab_Robot_Deploy_Keye ~/.ssh/GitLab_Robot_Deploy_Key.pub.

Copie e cole o conteúdo do ~/.ssh/GitLab_Robot_Deploy_Key.pubarquivo na caixa de diálogo "Deploy Keys" do GitLab.

Teste a nova chave de implantação

O comando a seguir diz ao SSH para usar sua nova chave de implantação para configurar a conexão. Com sucesso, você deverá receber a mensagem: "Bem-vindo ao GitLab, UserName!"

ssh -T -i ~/.ssh/GitLab_Robot_Deploy_Key [email protected]

Crie o arquivo de configuração SSH

Em seguida, use um editor para criar um ~/.ssh/configarquivo. Adicione o seguinte conteúdo. O valor 'Host' pode ser o que você quiser (lembre-se, porque você o usará mais tarde). O HostName é o URL da sua instância do GitLab. O IdentifyFile é o caminho para o arquivo de chave SSH que você criou na primeira etapa.

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

Aponte SSH para o arquivo de configuração

oxyum nos deu a receita para usar pip com SSH:

pip install git+ssh://[email protected]/my_name/my_repo.git

Só precisamos modificá-lo um pouco para que o SSH use nossa nova chave de implantação. Fazemos isso apontando SSH para a entrada Host no arquivo de configuração SSH. Apenas substitua 'gitlab.mycorp.com' no comando pelo nome do host que usamos no arquivo de configuração SSH:

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

O pacote agora deve ser instalado sem nenhum prompt de senha.

Referência A
Referência B

JS.
fonte
7

Quando estava instalando no GitHub, pude usar:

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

Mas, como eu tive que executar o pip as sudo, as chaves SSH não estavam mais funcionando com o GitHub e o "git clone" falhou em "Permission denied (publickey)". Usar git+httpsme permitiu executar o comando como sudo e o GitHub me pediu meu usuário / senha.

sudo pip install git+https://github.com/<username>/<projectname>.git#egg=<eggname>
jcarballo
fonte
Outras contas de usuário precisam acessar seu projeto? Caso contrário, você descobriu a sugestão de nerdwaller?
Michael - de onde Clay Shirky
7

Você também pode instalar uma dependência de repositório particular via git + https: //github.com / ... URL, fornecendo credenciais de login (login e senha ou implantar token) para se curvar com o .netrcarquivo:

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"
ei-grad
fonte
5

Se você deseja instalar dependências a partir de um arquivo de requisitos em um servidor de IC ou similar, pode fazer o seguinte:

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

No meu caso, eu usei GIT_USER=gitlab-ci-tokene GIT_PASS=${CI_JOB_TOKEN}.

Este método tem uma clara vantagem. Você tem um único arquivo de requisitos que contém todas as suas dependências.

AmirHossein
fonte
3

Se você não quiser usar o SSH, poderá adicionar o nome de usuário e a senha no URL HTTPS.

O código abaixo pressupõe que você tenha um arquivo chamado "pass" no diretório ativo que contém sua senha.

export PASS=$(cat pass)
pip install git+https://<username>:$PASS@github.com/echweb/echweb-utils.git
sam
fonte
Isso marca sua senha em texto sem formatação em algum arquivo de configuração?
Michael - Onde está Clay Shirky
0

a solução da oxyum está correta para esta resposta. Eu só quero ressaltar que você precisa ter cuidado se estiver instalando usando sudoas chaves, pois elas também devem ser armazenadas para root (por exemplo /root/.ssh).

Então você pode digitar

sudo pip install git+ssh://git@github.com/echweb/echweb-utils.git
Andres Romero
fonte
6
Solução fácil: não instale com o sudo. Em vez disso, use a --userbandeira ou um virtualenv.
Nerdwaller 12/11/2015
0

Se você possui sua própria biblioteca / pacote no GitHub, GitLab, etc., é necessário adicionar uma tag para confirmar com uma versão concreta da biblioteca, por exemplo, v2.0, e então você pode instalar o seu pacote:

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

Isso funciona para mim. Outras soluções não funcionaram para mim.

zolty13
fonte
0

Aqui está um método rápido que funcionou para mim. Simplesmente bifurque o repositório e instale-o a partir da sua própria conta GitHub com

pip install git+https://github.com/yourName/repoName
Codificador de Schrödinger
fonte
-1

Basta copiar o controle remoto do git clonecomando original (ou de git remote -v). Você obterá algo como isto:

Em seguida, você precisa substituir :por /próximo ao nome de domínio.

Então instale usando:

pip install git+ssh://git@bitbucket.org/your_account/my_pro.git
Mohideen bin Mohammed
fonte
O que você quer dizer com "comando copy git clone" ? Você quer dizer "copiar usando o comando 'git clone'" ? Ou "copie o comando 'git clone'" ? Ou alguma outra coisa? (Por favor, responda editando sua resposta , não aqui nos comentários (conforme apropriado). Agradecemos antecipadamente.).
Peter Mortensen
-2

Você pode tentar

pip install [email protected]/my_name/my_repo.git

sem ssh:.... Isso funciona para mim.

user2235670
fonte
O OP solicitou o github.
Karuhanga