为什么pip install -e git-repo在第二次调用时将HEAD更改为master

时间:2012-08-06 21:04:25

标签: python git github pip

如果我这样做:

pip install -e git://github.com/nimbis/django.git#egg=Django-dev

然后pip将从该存储库(1.4.1-patched)获取默认分支并安装它,正如您在安装它的src目录中看到的那样:

cd ~/.virtualenvs/nimbis/src/django
[(1.4.1-patched) ~/.virtualenvs/nimbis/src/django]
$ git log | head -n4
commit a5d7c7b3a2d6a729bf5ede2254b5c75be9da94d7
Author: Lorin Hochstein <...>
Date:   Mon Jul 30 21:44:20 2012 -0400

如果我再次这样做,HEAD将变得与远程主分支相同,尽管它仍然使用1.4.1-patched(默认分支)作为分支名称。

$ pip install -e git://github.com/nimbis/django.git#egg=Django-dev
[(1.4.1-patched) lorin@nibbler ~/.virtualenvs/nimbis/src/django]
$ git log | head -n4
commit e567f439bdfc60e16c465220fdaa8ea8a0fae936
Merge: c0748a6 226a3e7
Author: Alex Gaynor <...>
Date:   Sun Jul 29 17:07:55 2012 -0700

我可以通过显式指定我想要的分支来解决问题,但为什么pip会这样做呢?

2 个答案:

答案 0 :(得分:2)

如果目标路径已存在,则PIP VersionControl对象(pip.vcs.VersionControl)将检入check_destination。如果是这样,它调用update方法而不是获取。更新硬盘会默认重置分支。

您可以在上面和pip.vcs.git中引用的VersionControl类中看到确切的行为。

编辑:误读了一下代码。每次调用获取,但如果存储库已存在于目标,则更新(如果调用而不是克隆)。由于rev_options默认为“origin / master”,因此update会重置为此分支。

这很可能是一个错误!

答案 1 :(得分:-1)

pip install git+git://github.com/nimbis/django.git@branchorreviwant#egg=Django-dev