Я использую git hooks для автоматического обновления среды conda. Вы можете получить больше информации о git hooks здесь .
Идея состоит в том, чтобы иметь два git-хука:
- Тот, который обнаруживает, произошли ли изменения в вашей локальной среде conda, и, если это так, создайте новый коммит с обновленным файлом env.yml (я выбрал хук pre-push для этого).
- Тот, который обнаруживает изменение в env.yml файле после извлечения (то есть удаленный env.yml отличался от локального и был объединен, я выбрал post-merge крючок для этого)
Как описано в документации, при запуске git-репозитория создается папка .git / hooks , заполненная примерами сценариев. Чтобы использовать один из них, вам нужно только отредактировать файл, переименовать его, чтобы удалить его расширение ( .sample ) и убедиться, что он исполняемый.
ПРИМЕЧАНИЕ : я использую zsh в качестве оболочки, но сценарий должен быть таким же в bash (пожалуйста, прокомментируйте, если нет), вам просто нужно изменить строку shebang.
крюк предварительного толкания
- Перепишите файл pre-push.sample , уже существующий в .git / hooks (замените
<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 в pre-push hook .
- В настоящее время обновление среды conda после pull использует хук после слияния. Я не знаю, как это будет обрабатываться, например, в случае
rebase
.
- Здесь нет эксперта по git, возможно, есть хуки, лучше подходящие для этих задач.
- Я заметил раздел
prefix
в env.yml , в котором указан путь к папке вашей среды на локальном компьютере. После некоторого теста все, кажется, работает нормально, но я не знаю, может ли это как-то создать конфликты при разработке на разных машинах.
Итак ... комментарии, исправления и идеи улучшений приветствуются!