【问题标题】:Push and pull my conda environment using git使用 git 推拉我的 conda 环境
【发布时间】:2019-02-01 21:59:41
【问题描述】:

我的项目有一个 git repo。 我经常更改我的conda 环境,所以我希望我的存储库能够跟踪环境的变化,并能够推送最新的环境并将其拉入另一台计算机。可能吗? 我搜索并找到了几个解决方案(例如https://tdhopper.com/blog/my-python-environment-workflow-with-conda/),但没有一个提供自动更改跟踪。

意思是,我想将我在环境中所做的任何更改都包含到项目的存储库中。比如添加新包等。这样当我在另一台计算机上 git pull 时,新包也会被拉取并添加到环境中。

【问题讨论】:

  • 有可能。为您的问题添加更多详细信息,也许您会得到答案。
  • @TimBiegeleisen 缺少什么?
  • @okuoub 如果您有一些更改,请提交并将其从您的机器推送到 github。然后你使用 git pull 在你的另一台计算机上引入这些更改——这是使用 git 的正常方式。但也许你在问一些不同的事情——但你想完成什么并不是很清楚
  • @nos 我想将我在环境中所做的任何更改都包含到项目的存储库中。比如添加新包等。这样当我在另一台电脑上 git pull 的时候,新的包也会被拉取并添加到环境中。
  • @okuoub 好的,这很重要,所以将其添加到您的问题中。不过,我对 conda 的了解还不够,无法回答。

标签: git github version-control conda environment


【解决方案1】:

我使用 git hooks 来自动更新 conda 环境。您可以了解更多关于 git hooks here 的信息。

这里的想法是有两个 git 钩子:

  • 检测本地 conda 环境中是否发生更改,如果发生更改,则使用更新的 env.yml 文件创建新提交(我选择了 pre-push 钩住这个)。
  • 在拉取后检测到 env.yml 文件发生变化(即远程 env.yml 与本地不同并被合并,我选择了一个合并后这个钩子)

如文档中所述,当启动 git 存储库时,会创建一个文件夹 .git/hooks 并填充示例脚本。要使用其中之一,您只需编辑文件、重命名以删除其扩展名 (.sample) 并确保它是可执行的。

注意:我使用 zsh 作为 shell,但脚本在 bash 中应该是相同的(如果没有请评论),你只需要更改 shebang 行。


预推钩

  • 重写 .git/hooks 中已经存在的 pre-push.sample 文件(将 <ENV_NAME> 替换为您的 conda 环境的名称):
#!/usr/bin/env zsh

echo "\n==================== pre-push hook ===================="

# Export conda environment to yaml file
conda env export -n <ENV_NAME> > env.yml

# Check if new environment file is different from original 
git diff --exit-code --quiet env.yml 

# If new environment file is different, commit it
if [[ $? -eq 0 ]]; then
    echo "Conda environment not changed. No additional commit."
else
    echo "Conda environment changed. Commiting new env.yml"
    git add env.yml
    git commit -m "Updating conda environment"
    echo 'You need to push again to push additional "Updating conda environment" commit.'
    exit 1
fi
  • 删除其扩展名 .sample 并在必要时使其可执行 (chmod u+x pre-push)

合并后挂钩

#!/usr/bin/env zsh

echo "\n==================== post-merge hook ===================="

changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"

check_run() {
    echo "$changed_files" | grep --quiet "$1" && eval "$2"
}

echo "Have to update the conda environment"
check_run env.yml "conda env update --file env.yml"
  • 并使其可执行 (chmod u+x post-merge)

现在会发生什么?

  • 推送时,如果 conda 环境发生变化,将显示一条消息,提示您必须再次推送才能推送更新后的 env.yml
  • 拉取时,如果拉取的env.yml与本地的env.yml不同,conda会用新拉取的env.yml更新本地环境

限制

  • 如果本地环境发生变化,您可以看到更新后的 env.yml 不会自动推送到远程。我接受了这篇帖子 git commit in pre-push hook 的建议。
  • 目前,在 pull 之后更新 conda 环境正在使用 post-merge 挂钩。例如rebase,我不知道如何处理。
  • 这里没有 git 专家,也许有更适合这些任务的钩子。
  • 我注意到 env.yml 中有一个 prefix 部分,它提供了本地计算机上环境文件夹的路径。经过一些测试,一切似乎都运行良好,但我不知道这是否会在各种机器上开发时产生冲突。

所以......我们非常欢迎 cmets、更正和改进的想法!

【讨论】:

  • 这种方法对我不起作用。每次输入git push时都会得到以下输出:====================预推钩============ ======= .git/hooks/pre-push: 12: [[: 未找到 Conda 环境已更改。在分支 master 上提交新的 env.yml 您的分支在 'origin/master' 之前 2 次提交。 (使用“git push”发布您的本地提交)没有提交,工作树干净您需要再次推送以推送额外的“更新 conda 环境”提交。错误:未能将一些引用推送到 'git@github.com:amorris28/artificial_ecosystem_selection.git'
  • 我认为你的行conda env export -n &lt;ENV_NAME&gt; env.yml 需要&gt;env.yml 之前
  • 我也这么认为,谢谢你的评论。我相应地进行了编辑。
【解决方案2】:

在 Conda 中,您可以创建虚拟环境并将环境导出到文件中,该文件可以包含在您的 git 存储库中。如果你在另一台机器上下载你的 repo 或删除你的环境,你可以运行:

conda env create -f=env.yml

当您对环境进行更改时,请在添加/提交之前运行导出:

conda env export > env.yml

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 2017-08-02
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多