gpt4 book ai didi

git - 使用 git 推送和 pull 我的 conda 环境

转载 作者:太空狗 更新时间:2023-10-29 13:54:30 27 4
gpt4 key购买 nike

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

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

最佳答案

我使用 git hooks 自动更新 conda 环境。您可以获得有关 git hooks 的更多信息 here .

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

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

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

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


预推钩子(Hook)

  • 重写 .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)

merge 后 Hook

#!/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
  • pull 时,如果 pull 的env.yml与本地的env.yml不同,conda会用新 pull 的env.yml更新本地环境

限制

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

所以...非常欢迎评论、更正和改进的想法!

关于git - 使用 git 推送和 pull 我的 conda 环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52038034/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com