我们正在使用 conda 来管理我们的 Python 项目的环境。让我们烦恼的一件事是团队中有人偶尔会在环境中安装一个新包,但忘记更新 requirements.yml 文件。
而不是在每次提交之前输入:
conda env export > requirements.yml
是否可以在有人安装或删除软件包时自动更新该文件?
请您参考如下方法:
Git 钩子(Hook)
我不知道 conda(安装/升级/删除) 的 Hook 。但是,可以为 pre-commit 添加一个 Git Hook ,检查 environment.yaml 文件是否与 conda env export 的输出相匹配.有点像
.git/hooks/预提交
#!/bin/bash
CONDA_ENV='my_env'
ENV_FILE='environment.yaml'
echo "Checking Conda environment '$CONDA_ENV' for changes..."
CONDA_YAML=$(conda env export -n $CONDA_ENV)
DIFF=$(echo "$CONDA_YAML" | git diff --no-index -- "$ENV_FILE" -)
if [ "$DIFF" != "" ]
then
echo "Changes were found in the Conda environment!"
echo "$DIFF"
echo "Updating $ENV_FILE."
echo "$CONDA_YAML" > "$ENV_FILE"
echo "Adding updated $ENV_FILE to commit."
git add "$ENV_FILE"
else
echo "No changes detected. Proceeding with commit."
fi
exit 0
这可能是最残酷的做法(即,只是盲目地覆盖文件并将其放入提交中)。一个更温和的选择是向用户发出警告并按原样继续提交。然后他们可以选择是否需要使用他们的 env YAML 修改提交。
此脚本主要只是概念验证。您可能需要解决的问题是,除非您的团队只有一个 env 实例,否则 YAML 中的 prefix: ... 行将有所不同; channels: ... 如果用户有不同的 .condarc 设置,也可能会略有不同。我想您可以从 $CONDA_YAML 中过滤掉此类差异以跨用户规范化。否则,每次不同的用户提交时,它都会提交一个新版本。
不幸的是,you can't push hook files directly ,所以你需要说服你的团队以某种方式将这样的脚本放在他们本地的 .git/hooks/ 文件夹中。 This thread讨论了一些使其间接提交的技巧。
