O backend Git ( pip.vcs.git
) depende do fato de que o Git usa $CWD
como o diretório do repositório. O problema é que as variáveis de ambiente $GIT_DIR
/ $GIT_WORK_TREE
podem ser usadas para sobrescrever isso, e então sempre o mesmo repositório será consultado ao invés do identificado em location
.
Portanto, em vez de $CWD
, pip.vcs.git
deve sempre especificar --work-tree
.
http://git-scm.com/blog/2010/04/11/environment.html
Alternativamente, ele poderia simplesmente remover a definição dessas variáveis antes de invocar git
.
Você poderia fornecer um caso de teste que demonstrasse onde o pip falha exatamente?
Configurar:
$ mkvirtualenv pip-test
$ pip install -e [email protected]:jkbr/httpie.git#egg=httpie
Falhou:
$ GIT_DIR=/foo pip freeze
Error when trying to get requirement for VCS system Command /usr/local/bin/git config remote.origin.url failed with error code 1 in /Users/jakub/.virtualenvs/pip-test/src/httpie, falling back to uneditable format
Could not determine repository location of ~/.virtualenvs/pip-test/src/httpie
Pygments==1.6
## !! Could not determine repository location
httpie==0.6.0
requests==1.2.3
wsgiref==0.1.2
GIT_DIR
será definido, por exemplo, em scripts invocados como ganchos Git.
Posso confirmar esse problema, mesmo problema aqui.
Um exemplo do mundo real que aciona esse comportamento indesejado é a execução de pip de dentro de um gancho pós-atualização do repositório git.
Dentro do gancho, GIT_DIR será definido como '.', O que faz com que pip opere naquele mesmo repositório em vez de no repositório clonado por pip.
Além de configurar --work-tree explicitamente, outra solução seria desconfigurar GIT_DIR (e GIT_WORK_TREE).
Publiquei PR # 4666 para resolver isso. (Observe que os testes estão bem, embora o ícone do Travis CI mostre falha. Parece haver instabilidade nas execuções de teste do Travis CI recentemente.)
Comentários muito úteis
Posso confirmar esse problema, mesmo problema aqui.
Um exemplo do mundo real que aciona esse comportamento indesejado é a execução de pip de dentro de um gancho pós-atualização do repositório git.
Dentro do gancho, GIT_DIR será definido como '.', O que faz com que pip opere naquele mesmo repositório em vez de no repositório clonado por pip.
Além de configurar --work-tree explicitamente, outra solução seria desconfigurar GIT_DIR (e GIT_WORK_TREE).