使用git管理virtualenv状态:会出现问题吗?

19 投票
3 回答
5266 浏览
提问于 2025-04-16 17:23

我现在的 git 和 virtualenv 设置得很好,完全符合我的需求,而且到目前为止没有出现任何问题。不过我知道我的设置有点不标准,所以想问问有没有人能告诉我,特别是对 virtualenv 内部工作原理比较熟悉的人,看看我的设置可能会在哪些地方出问题。

我的设置

我的 virtualenv 放在我的 git 仓库里,但 git 被设置成忽略 bininclude 这两个文件夹,以及 lib 文件夹里的所有内容,除了 site-packages 文件夹。

更具体地说,我的 .gitignore 文件是这样的:

*.pyc

# Ignore all the virtualenv stuff except the actual packages
# themselves
/bin
/include
/lib/python*/*
!/lib/python*/site-packages

# Ignore easyinstall and setuptools
/lib/python*/site-packages/easy-install.pth
/lib/python*/site-packages/setuptools.pth
/lib/python*/site-packages/setuptools-*
/lib/python*/site-packages/pip-*

通过这种方式,我和其他任何在这个项目上工作的人都可以像平常一样使用 virtualenv 和 pip,但有以下几个好处:

  1. 如果有人更新或安装了一个包并推送了他们的更改,其他人拉取这些更改时会自动得到更新:他们不需要注意 requirements.txt 文件是否有变化,也不需要做任何 post-receive 钩子的复杂操作。

  2. 没有网络依赖:让应用程序正常工作的所有代码都在 git 仓库里。

我知道这种方法只适用于纯 Python 包,但目前我只关心这个。

有没有人知道这种方法还有其他我应该注意的问题吗?

3 个回答

2

在我的虚拟环境中,路径是绝对的,具体来说是在 /lib/python2.7/site-packages 这个地方。例如,在 Django.egg-link 文件里,我看到的路径是 /Users/henry/.virtualenv/mowapp/src/django(这是在Mac电脑上)。

检查一下你在git里是否有任何绝对路径被记录下来,我觉得这可能是这个方法的一个大问题。

10

这个问题挺有意思的。我觉得其他两个回答提到了一些很好的具体观点。显然,你已经认真考虑过这个问题,并找到了一个你喜欢的解决方案。不过,我想指出的是,在使用虚拟环境(virtualenv)的人中,似乎存在一种哲学上的分歧。

一部分人,我猜你可能属于这一类,认为本地的虚拟环境是项目的一部分(也就是说,它应该被纳入版本控制)。而另一部分人则认为虚拟环境应该被视为开发过程中的一个产物——也就是说,requirements.txt 文件应该是项目仓库的一部分,但你应该能够根据需要随时删除并重新创建虚拟环境。

我提到这个是因为,当我第一次看到这种区分时,它帮助我更好地理解了虚拟环境的概念。(我属于第二类,顺便说一下,因为我觉得这样更简单、更干净,但这并不是说第一类在你的特定项目中是错误的。)

6

如果你的 requirements.txt 文件里有任何 -e 项目,也就是说你有一些可编辑的依赖项,这些依赖项是用 这种格式描述的,并且它们使用了 git 这个版本控制系统,那么当你的 src 目录被提交的时候,你很可能会遇到一些问题。如果你只是把 /src 加到你的 .gitignore 文件里,这样可以避免这个问题,但通常情况下,安装时只是会在 site-packages 里添加一个指向这个位置的链接,所以你其实是需要这个目录的!

撰写回答