将Git克隆到虚拟Python环境的推荐工作流程

8
如果我想将一个git仓库拉到虚拟Python环境中,推荐的工作流程是什么? 我认为最简单的方式是:
  1. 创建一个空目录
  2. 进入该目录并使用git clone <repo>,因为它只能在空目录中起作用
  3. 在同一目录下的子目录中创建虚拟环境
  4. 启动VE并从<repo>安装requirements.txt。
  5. 将子目录(和其他仅供自己使用的内容)添加到.gitignore中
  6. 按预期工作在项目上
  7. 也许要求推送有价值/可共享的结果到原始repo。
还是有更好的方法吗?
免责声明:我对git很陌生,请见谅。我知道已经有多个类似的答案了,但是我找不到令人信服的TL;DR。也许我错过了。

将VE添加到git的目的是什么?我认为通常应该足够使用requirements.txt。 - Chuan
@Chuan VE(虚拟环境)隔离了项目,即克隆。在VE中,我只有它的requirements.txt文件中所列出的内容,没有多余的也没有少的。此外,我还有一个“全局”的Python开发环境(实际上有几个),其中可能包含与克隆所需的库不同版本的库。 - RolfBly
当然,我明白。但在我看来,VE不应该添加到git中,它仅应用于像你所提到的那样隔离工作环境。 - Chuan
@Chuan 我明白你的意思。你把VE放在克隆外面,对吧?这意味着需要更多的打字(更容易出错)。我喜欢尽可能保持简短。我想这是品味问题。 - RolfBly
1
顺便说一下,我通常使用virtualenvwrapper来管理所有的虚拟环境,并且从不将虚拟环境提交到git。 - Chuan
@Chuan 谢谢你。我不知道那个。 - RolfBly
3个回答

5
这是我喜欢做的事情:
git clone <repo> <repodir>
cd <repodir>
virtualenv .venv
. .venv/bin/activate
pip install -e .

这就是全部的内容。现在,我所做的任何编辑都将在虚拟环境中“实时”生效。我有一个全局的.gitignore文件(git config --global core.excludesfile ~/.gitignore),其中包含.venv,因此我不需要在各个存储库中更新.gitignore。
请注意,您无需在空目录中运行git clone。因为它会创建一个新的目录,所以它不关心当前目录是否为空。
更新
看,我们在一个非空目录中:
bash-4.4$ ls
file1  file2  file3

我们可以在这里运行git clone

bash-4.4$ git clone https://github.com/git/git
Cloning into 'git'...
remote: Enumerating objects: 264438, done.
remote: Total 264438 (delta 0), reused 0 (delta 0), pack-reused 264438
Receiving objects: 100% (264438/264438), 112.69 MiB | 9.84 MiB/s, done.
Resolving deltas: 100% (196057/196057), done.

它运行顺利,创建了一个新的目录:
bash-4.4$ ls
file1  file2  file3  git

哦,Windows上的git不允许我在驱动器根目录下进行git克隆,因为“它不是空的”。我相信Linux的git也是一样的,可以参考这里 - RolfBly
不,这对于Linux git绝对不是一样的。您不能在非空目录中运行 git init,但是 git clone 不关心(因为它会创建一个新的子目录)。我已在答案中添加了一个示例。如果看到Windows下的git表现不同,我会感到惊讶。 - larsks
Windows: "此文件夹包含文件。Git 只能克隆到空文件夹中。" 这是一个截图(希望可以显示)。 - RolfBly
我明白了,你没有使用命令行。我无法评论GUI的操作方式,但看起来在这种情况下,它要求你提供一个目录,以便将克隆的文件放置其中(从命令行来看,可能类似于git clone <repo> existingdir/,在这种情况下,确实,目标必须为空。但这通常不是使用git的方式。 - larsks
当你在Windows GUI中输入仓库的URL,例如 https://git/me/foo,并且你的默认目标目录是 Z:\ 时,它会创建 Z:\foo 并将其克隆到其中。如果你首先在 Z:\foo 中放置一个 VE,然后尝试在旁边进行 git 克隆,git 将拒绝,原因如上所述。 - RolfBly
这对我来说是有效的,除了最后一个命令:pip install -e . 这需要一个 setup.py 或者 pyproject.toml 文件;我克隆的仓库中没有这两个文件。在我的情况下,我只需要安装一个单独的库,使用经典的 pip install 方法就可以正常工作。 - Bobby Jack

4
如果您想要克隆一个库并在其中使用它,而已经有了与该项目相关的虚拟环境,则可以按照以下步骤进行操作:
  1. 激活项目的虚拟环境
    source .venv/bin/activate.fish
  2. 卸载您要用git克隆库替换的软件包:
    pip uninstall <package>
  3. 通过git重新安装软件包:
    pip install -e git+ssh://git@github.com/<org>/<package>.git#egg=<package>
  4. 切换到软件包目录以处理仓库文件
    cd .venv/src/<package>

0
据我所知,不建议在项目的git目录中初始化和存储虚拟环境。这种情况下,您的env空间会暴露给某些漏洞,其中包括:
  1. 如果您删除项目目录,则会丢失env。因此,在其他项目中正确使用它没有可扩展性。
  2. 您需要始终记住.gitignore文件中的内容,以避免意外分发您的env。
  3. 我不知道有什么简单的方法可以使用标准的python3-venv列出所有envs。因此,如果您像这样操作,偶尔您将难以找到可用的envs。

相反,推荐的方法是使用virtualenvwrapper工具,该工具将所有envs存储在一个特定的目录中,最常见的是~/.virtualenvs。该工具有助于创建、删除和在envs之间切换。请参阅post了解更多信息。

基于以上所述,推荐的工作流程:

  • 安装 virtualenvwrapper
  • 使用 mkvirtualenv $env_name 命令创建新的环境
  • 使用 git clone <rep> 命令初始化您的代码库
  • 在您的 $env_name 环境下运行 pip install -r requirements.txt 命令

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接