Spec-Zone.ru › NumPy 2.0

Процесс разработки

У вас уже есть своя вилка репозитория NumPy, настроен Git и связаны с исходным репозиторием, как описано в Связывание вашего репозитория с исходным. Ниже описан рекомендуемый процесс работы с Git.

Базовый процесс

Коротко:

  1. Для каждого набора изменений создавайте новую ветвь функции. См. ниже.
  2. Приступайте к работе! См. ниже
  3. По завершении:

    • Авторы: отправьте свою ветвь функции в свой репозиторий на GitHub и создайте запрос на слияние.
    • Основные разработчики: Если вы хотите отправить изменения без дальнейшего рассмотрения, см. примечания ниже.

Такой способ работы помогает поддерживать структуру работы и историю максимально понятной.

Создание новой ветви функции

Сначала получите новые коммиты из репозитория:

upstream

Затем создайте новую ветвь, основанную на основной ветви исходного репозитория:

git fetch upstream

Процесс редактирования

Обзор

git checkout -b my-new-feature upstream/main

Подробно

  1. Внесите изменения. Когда вы почувствуете, что сделали полный и рабочий набор связанных изменений, переходите к следующим шагам.
  2. Необязательно: Проверьте, какие файлы изменились с помощью

    # hack hack
    git status # Optional
    git diff # Optional
    git add modified_file
    git commit
    # push the branch to your own Github repo
    git push origin my-new-feature
    
    . Вы увидите список, подобный этому:

    git status
  3. Необязательно: Сравните изменения с предыдущей версией с помощью
    # On branch my-new-feature
    # Changed but not updated:
    #   (use "git add <file>..." to update what will be committed)
    #   (use "git checkout -- <file>..." to discard changes in working directory)
    #
    #  modified:   README
    #
    # Untracked files:
    #   (use "git add <file>..." to include in what will be committed)
    #
    #  INSTALL
    no changes added to commit (use "git add" and/or "git commit -a")
    
    . Это откроет простую текстовую оболочку, которая выделит разницу между вашими файлами и предыдущей версией.
  4. Добавьте все соответствующие изменённые или новые файлы, используя git diff. Это помещает файлы в зону подготовки, которая является очередью файлов, которые будут добавлены в следующий коммит. Добавляйте только файлы с связанными, завершёнными изменениями. Файлы с незавершенными изменениями оставьте для последующих коммитов.
  5. Чтобы зафиксировать подготовленные файлы в локальной копии вашего репозитория, выполните git add modified_file. В этот момент откроется текстовый редактор, чтобы вы могли написать сообщение о коммите. Прочитайте раздел сообщение о коммите, чтобы убедиться, что вы пишете сообщение о коммите с правильным форматом и достаточной детализацией. После сохранения сообщения и закрытия редактора ваш коммит будет сохранён. Для тривиальных коммитов краткое сообщение о коммите можно передать через командную строку, используя флаг git commit . Например, -m.

    В некоторых случаях вы увидите такой вид команды коммита: git commit -am "ENH: Some message". Дополнительный флаг git commit -a автоматически коммитит все изменённые файлы и удаляет все удалённые файлы. Это может сэкономить вам набирание многочисленных -a команд; однако, это может добавить нежелательные изменения в коммит, если вы не внимательны.

  6. Отправьте изменения в свою вилку на GitHub:

    git add

Примечание

Предполагая, что вы следовали инструкциям на этих страницах, git создаст по умолчанию ссылку на ваш репозиторий на GitHub под названием

git push origin my-new-feature
. Вы можете гарантировать, что ссылка на origin будет постоянно установлена, используя опцию origin.

--set-upstream

Теперь

git push --set-upstream origin my-new-feature
будет знать, что git связано с ветвью my-new-feature в вашем репозитории на GitHub. Последующие вызовы push упрощаются следующим образом:

my-new-feature

Вы должны использовать

git push
для каждой новой ветви, которую вы создаёте.

Возможно, пока вы работали над изменениями, в --set-upstream были добавлены новые коммиты, которые влияют на вашу работу. В этом случае следуйте разделу Перебазирование на главную этого документа, чтобы применить эти изменения к вашей ветви.

Написание сообщения о коммите

Сообщения о коммитах должны быть ясными и следовать нескольким основным правилам. Пример:

upstream

Описание мотивации изменения, характера ошибки для исправлений ошибок или некоторых деталей о том, что делает улучшение, также полезно включать в сообщение о коммите. Сообщения должны быть понятны без просмотра кодовых изменений. Сообщение о коммите, как

ENH: add functionality X to numpy.<submodule>.

The first line of the commit message starts with a capitalized acronym
(options listed below) indicating what type of commit this is.  Then a blank
line, then more text if needed.  Lines shouldn't be longer than 72
characters.  If the commit is related to a ticket, indicate that with
"See #3456", "See ticket 3456", "Closes #3456" or similar.
— пример того, чего делать не следует; читателю необходимо искать контекст в другом месте.

Стандартные аббревиатуры для начала сообщения о коммите:

MAINT: fixed another one
Команды для пропуска непрерывной интеграции

По умолчанию выполняется много задач непрерывной интеграции (CI) для каждого запроса на слияние, от выполнения наборов тестов на различных операционных системах и аппаратных платформах до создания документации. В некоторых случаях вам уже известно, что CI не требуется (или не требуется всё), например, если вы работаете с конфигурационными файлами CI, текстом в файле README или другими файлами, которые не участвуют в обычных процессах сборки, тестирования или создания документации. В таких случаях вы можете явно пропустить CI, включив один или несколько из этих фрагментов в каждое сообщение о коммите запроса на слияние:

  • API: an (incompatible) API change
    BENCH: changes to the benchmark suite
    BLD: change related to building numpy
    BUG: bug fix
    DEP: deprecate something, or remove a deprecated object
    DEV: development tool or utility
    DOC: documentation
    ENH: enhancement
    MAINT: maintenance commit (refactoring, typos, etc.)
    REV: revert an earlier commit
    STY: style fix (whitespace, PEP8)
    TST: addition or modification of tests
    TYP: static typing
    REL: related to releasing numpy
    
    : пропустить все CI

    Рекомендуется только в том случае, если вы ещё не готовы к запуску проверок на своём запросе на слияние (например, если это только черновик).

  • [skip ci]: пропустить задачи GitHub Actions

    GitHub Actions — здесь выполняется большинство проверок CI, включая проверки кода, тестирование производительности, выполнение основных тестов для большинства архитектур и ОС, а также несколько параметров компиляции и оптимизации процессора. См. файлы конфигурации для этих проверок.

  • [skip actions]: пропустить задачи Azure

    Azure — здесь выполняются все комплексные тесты. Это дорогостоящая задача, которую обычно можно пропустить, если вы вносите изменения только в документацию, например. См. главный файл конфигурации для этих проверок.

  • [skip azp]: пропустить задачи CircleCI

    CircleCI — здесь создаётся документация и хранятся сгенерированные артефакты для предварительного просмотра в каждом запросе на слияние. Эта проверка также выполнит все примеры docstrings и проверит их результаты. Если вы не вносите изменения в документацию, но вносите изменения в API функции, например, вам может потребоваться запустить эти тесты, чтобы убедиться, что doctests по-прежнему действительны. См. файл конфигурации для этих проверок.

  • [skip circle]: пропустить задачи Cirrus

    CirrusCI в основном запускает загрузку Linux aarch64 и MacOS Arm64 колес. См. файл конфигурации для этих проверок.

Тестирование сборки колес

В настоящее время Numpy использует cibuildwheel для сборки колес через сервисы непрерывной интеграции. Чтобы сэкономить ресурсы, сборщики колес cibuildwheel не запускаются по умолчанию для каждого запроса на слияние или коммита в основной ветке.

Если вы хотите проверить, что ваш запрос на слияние не нарушит сборку колес, вы можете сделать это, добавив [skip cirrus] в первую строку сообщения о коммите последнего коммита в вашем запросе на слияние. Делайте это только для запросов на слияние, связанных со сборкой, потому что запуск всех сборок колес занимает много времени и ресурсов.

Колеса, собранные с помощью GitHub Actions (включая 64-битный Linux, x86-64 macOS и 32/64-битный Windows), будут загружены как артефакты в zip-файлах. Вы можете получить к ним доступ на странице «Сводка» действия «Сборщик колес». Колеса aarch64 Linux и arm64 macOS, собранные через Cirrus CI, недоступны как артефакты. Кроме того, колёса будут загружены на https://anaconda.org/scientific-python-nightly-wheels/ при следующих условиях:

  • еженедельной задачей cron или
  • если GitHub Actions или Cirrus сборка была запущена вручную, что требует соответствующих прав

Колеса будут загружены на https://anaconda.org/multibuild-wheels-staging/, если сборка была запущена по тегу репозитория, начинающегося с [wheel build]

Получение мнения списка рассылки

Если вы планируете новую функцию или изменение API, разумнее всего сначала отправить электронное письмо на список рассылки NumPy почта рассылки, чтобы запросить комментарии. Если вы не получите ответа в течение недели, можете снова отправить письмо на список рассылки.

Запрос на слияние ваших изменений с основным репозиторием

Когда вы закончите работу, вы можете создать запрос на слияние (PR). Если ваши изменения включают изменения API или добавление/модификацию функции, добавьте заметку о выпуске в каталог v в соответствии с инструкциями и форматом в файле doc/release/upcoming_changes/.

Рассмотрение вашего запроса на слияние

Мы рассматриваем запросы на слияние как можно скорее, обычно в течение недели. Если вы не получите комментариев к вашему запросу на слияние в течение двух недель, смело запросите обратную связь, добавив комментарий к запросу на слияние (это уведомит ответственных лиц).

Если ваш запрос на слияние большой или сложный, запросить отзывы на списке рассылки numpy-discussion может быть полезно.

Слияние с веткой main

Это обновляет вашу ветку функции изменениями из репозитория NumPy на GitHub. Если вам совершенно не нужно это делать, старайтесь этого избегать, разве что, когда вы закончите. Первым шагом будет обновление удалённого репозитория новыми коммитами из upstream:

git fetch upstream

Далее, вам нужно обновить ветку функции:

# go to the feature branch
git checkout my-new-feature
# make a backup in case you mess up
git branch tmp my-new-feature
# rebase on upstream main branch
git rebase upstream/main

Если вы внесли изменения в файлы, которые также были изменены в upstream, это может создать конфликты слияния, которые вам необходимо разрешить. Смотрите ниже за помощью в этом случае.

Наконец, удалите резервную ветку после успешного слияния:

git branch -D tmp

Примечание

Слияние с веткой main предпочтительнее, чем слияние upstream обратно в вашу ветку. Использование git merge и git pull не рекомендуется при работе с ветками функций.

Восстановление после ошибок

Иногда вы совершаете ошибки при слияниях или слияниях с веткой main. К счастью, в Git относительно просто восстановиться от таких ошибок.

Если вы допустили ошибку во время слияния:

git rebase --abort

Если вы заметили ошибку после слияния:

# reset branch back to the saved point
git reset --hard tmp

Если вы забыли создать резервную ветку:

# look at the reflog of the branch
git reflog show my-feature-branch

8630830 my-feature-branch@{0}: commit: BUG: io: close file handles immediately
278dd2a my-feature-branch@{1}: rebase finished: refs/heads/my-feature-branch onto 11ee694744f2552d
26aa21a my-feature-branch@{2}: commit: BUG: lib: make seek_gzip_factory not leak gzip obj
...

# reset the branch to where it was before the botched rebase
git reset --hard my-feature-branch@{2}

Если вы не допустили ошибки, но есть конфликты слияния, вам нужно их разрешить.

Дополнительные действия, которые вы можете выполнить

Переписывание истории коммитов

Примечание

Делайте это только для собственных веток функций.

В коммите есть неудачная опечатка? Или, возможно, вы несколько раз начинали заново, и вы не хотите, чтобы об этом помнили потомки?

Это можно сделать с помощью интерактивного слияния.

Предположим, что история коммитов выглядит так:

git log --oneline
eadc391 Fix some remaining bugs
a815645 Modify it so that it works
2dec1ac Fix a few bugs + disable
13d7934 First implementation
6ad92e5 * masked is now an instance of a new object, MaskedConstant
29001ed Add pre-nep for a couple of structured_array_extensions.
...

и 6ad92e5 — последний коммит в ветке main. Предположим, что мы хотим внести следующие изменения:

  • Переписать сообщение коммита для 13d7934 на что-то более осмысленное.
  • Объединить коммиты 2dec1ac, a815645, eadc391 в один.

Мы делаем следующее:

# make a backup of the current state
git branch tmp HEAD
# interactive rebase
git rebase -i 6ad92e5

Это откроет редактор с указанным текстом:

pick 13d7934 First implementation
pick 2dec1ac Fix a few bugs + disable
pick a815645 Modify it so that it works
pick eadc391 Fix some remaining bugs

# Rebase 6ad92e5..eadc391 onto 6ad92e5
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Чтобы достичь желаемого результата, внесем следующие изменения:

r 13d7934 First implementation
pick 2dec1ac Fix a few bugs + disable
f a815645 Modify it so that it works
f eadc391 Fix some remaining bugs

Это означает, что (i) мы хотим изменить сообщение коммита для 13d7934, и (ii) объединить последние три коммита в один. Теперь сохраняем и выходим из редактора.

Git немедленно откроет редактор для изменения сообщения коммита. После его пересмотра мы получим результат:

[detached HEAD 721fc64] FOO: First implementation
 2 files changed, 199 insertions(+), 66 deletions(-)
[detached HEAD 0f22701] Fix a few bugs + disable
 1 files changed, 79 insertions(+), 61 deletions(-)
Successfully rebased and updated refs/heads/my-feature-branch.

и история теперь выглядит следующим образом:

0f22701 Fix a few bugs + disable
721fc64 ENH: Sophisticated feature
6ad92e5 * masked is now an instance of a new object, MaskedConstant

Если что-то пошло не так, восстановление снова возможно, как описано выше.

Удаление ветки на GitHub

git checkout main
# delete branch locally
git branch -D my-unwanted-branch
# delete branch on github
git push origin --delete my-unwanted-branch

См. также: https://stackoverflow.com/questions/2003505/how-do-i-delete-a-git-branch-locally-and-remotely

Несколько человек, разделяющих один репозиторий

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

Сначала создайте форк NumPy в своей учетной записи, как в Создании собственной копии (форка) scikit-image.

Затем перейдите на страницу вашего форкнутого репозитория на GitHub, например, https://github.com/your-user-name/numpy

Нажмите кнопку «Администрирование», и добавьте других людей в репозиторий в качестве коллабораторов:

../_images/pull_button.png

Теперь все эти люди могут:

git clone git@github.com:your-user-name/numpy.git

Помните, что ссылки, начинающиеся с git@, используют протокол ssh и являются чтением/записью; ссылки, начинающиеся с git://, являются только для чтения.

Ваши соавторы затем могут вносить изменения напрямую в этот репозиторий с помощью обычных команд:

git commit -am 'ENH - much better code'
git push origin my-feature-branch # pushes directly into your repo

Получение изменений из существующего запроса на вытягивание

Если вы хотите протестировать изменения в запросе на вытягивание или продолжить работу в новом запросе на вытягивание, коммиты должны быть клонированы в локальную ветку в вашем форкнутом репозитории.

Сначала убедитесь, что ваш upstream указывает на основной репозиторий, как в Связывании вашего репозитория с основным репозиторием.

Затем, получите изменения и создайте локальную ветку. Предполагая, что $ID — номер запроса на вытягивание, а $BRANCHNAME — имя новой локальной ветки, которую вы хотите создать:

git fetch upstream pull/$ID/head:$BRANCHNAME

Переключитесь на только что созданную ветку:

git checkout $BRANCHNAME

Теперь у вас есть изменения в запросе на вытягивание.

Обзор вашего репозитория

Чтобы увидеть графическое представление веток и коммитов репозитория:

gitk --all

Чтобы увидеть линейный список коммитов для этой ветки:

git log

Бэкпортирование

Бэкпортирование — это процесс копирования новых функций/исправлений, внесённых в ветку main NumPy, обратно в ветки стабильных выпусков. Для этого вы создаёте ветку от ветки, в которую вы бэкпортите, выбираете нужные коммиты из numpy/main, и затем отправляете запрос на вытягивание для ветки, содержащей бэкпорт.

  1. Сначала вам нужно создать ветку, в которой вы будете работать. Она должна быть основана на более старой версии NumPy (не main):

    # Make a new branch based on numpy/maintenance/1.8.x,
    # backport-3324 is our new name for the branch.
    git checkout -b backport-3324 upstream/maintenance/1.8.x
    
  2. Теперь вам нужно применить изменения из main в эту ветку, используя git cherry-pick:

    # Update remote
    git fetch upstream
    # Check the commit log for commits to cherry pick
    git log upstream/main
    # This pull request included commits aa7a047 to c098283 (inclusive)
    # so you use the .. syntax (for a range of commits), the ^ makes the
    # range inclusive.
    git cherry-pick aa7a047^..c098283
    ...
    # Fix any conflicts, then if needed:
    git cherry-pick --continue
    
  3. Вы можете столкнуться с некоторыми конфликтами при выборе коммитов. Они решаются так же, как и конфликты при слиянии/слиянии с веткой main. За исключением того, что здесь вы можете использовать git blame для сравнения различий между main и бэкпортированной веткой, чтобы убедиться, что ничего не сломано.
  4. Отправьте новую ветку в свой репозиторий на GitHub:

    git push -u origin backport-3324
    
  5. Наконец, создайте запрос на вытягивание с помощью GitHub. Убедитесь, что это запрос на вытягивание против ветки сопровождения, а не main, GitHub обычно предложит вам сделать запрос на вытягивание против main.

Отправка изменений в основной репозиторий

Требуются права на коммит в основной репозиторий NumPy.

Когда у вас есть набор «готовых» изменений в ветке функции, готовых к веткам main или maintenance NumPy, вы можете отправить их в upstream следующим образом:

  1. Сначала объедините или слийте изменения с целевой веткой.

    1. Если коммиты немногочисленные и не связанные, предпочтительнее использовать слияние:

      git fetch upstream
      git rebase upstream/main
      

      См. Слияние с веткой main.

    2. Если все коммиты взаимосвязаны, создайте коммит слияния:

      git fetch upstream
      git merge --no-ff upstream/main
      
  2. Проверьте, что отправляемое вами выглядит разумно:

    git log -p upstream/main..
    git log --oneline --graph
    
  3. Отправьте изменения в upstream:

    git push upstream my-feature-branch:main
    

Примечание

Обычно рекомендуется использовать флаг -n для git push для предварительной проверки, что вы собираетесь отправить нужные изменения в нужное место.

© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/dev/development_workflow.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API