Нажмите и потяните мою среду conda, используя git - PullRequest
0 голосов
/ 27 августа 2018

У меня есть git-репо с моим проектом.Я изменяю свою среду conda довольно часто, поэтому я хочу, чтобы мое хранилище отслеживало изменения в этой среде и было в состоянии перенести самую последнюю и перенести ее на другой компьютер.Является ли это возможным?Я ищу и нахожу несколько решений (например, https://tdhopper.com/blog/my-python-environment-workflow-with-conda/), но не предоставляю автоматическое отслеживание изменений.

То есть я хочу включить любые изменения, которые я внесу в свою среду, в репозиторий проекта. Например, добавление новогопакеты и т. д. Так что, когда я буду использовать git pull на другом компьютере, новый пакет также будет извлечен и добавлен в среду.

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Я использую 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)

крюк после слияния

  • В моей папке .git / hooks не было post-merge.sample hook, поэтому я создал файл post-merge и использовал эту суть https://gist.github.com/sindresorhus/7996717 как шаблон:
#!/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 , в котором указан путь к папке вашей среды на локальном компьютере. После некоторого теста все, кажется, работает нормально, но я не знаю, может ли это как-то создать конфликты при разработке на разных машинах.

Итак ... комментарии, исправления и идеи улучшений приветствуются!

0 голосов
/ 23 декабря 2018

В Conda вы можете создавать виртуальную среду и экспортировать среду в файл, который может быть включен в ваше git-репо. Если вы откроете репо на другом компьютере или удалите свою среду, вы можете запустить:

conda env create -f=env.yml

Когда вы вносите изменения в вашу среду, запустите экспорт, прежде чем добавить / зафиксировать:

conda env export > env.yml
...