Как программно редактировать файлы в другой ветке, даже если в текущей ветке есть незафиксированные изменения? - PullRequest
0 голосов
/ 16 января 2020

В качестве личного упражнения я пишу командную строку и средство отслеживания проблем на основе git, где проблемы сохраняются в другой ветви git (скажем, project-issues). Допустим, я сейчас работаю над веткой master. При использовании моего средства отслеживания ошибок для запуска issue-tracker --add-issue "Fix all bugs" потребуется изменить содержимое ветви project-issues. Таким образом, вопрос заключается в следующем: каков рекомендуемый способ программного изменения содержимого другой ветви (даже если в текущей ветви есть незафиксированные изменения)?

Возможные методы, о которых я думал:

  • Программа запускает git stash в ветке, в которой работает пользователь, переключается на ветку project-issues, делает необходимые коммиты на ветку project-issues, переключается обратно на ветку, в которой изначально был пользователь , затем запускает git stash apply.
  • Программа создает временный рабочий каталог для ветви project-issues, используя git -workdir, делает необходимые коммиты во временном рабочем каталоге, затем удаляет временный рабочий каталог.

Есть ли более простое решение этой проблемы?

PS Программа написана на Python.

Ответы [ 3 ]

1 голос
/ 16 января 2020

Я бы предложил избегать git stash. Он полон острых угловых коробок.

Если у вас есть git worktree add, используйте это. У него есть неприятный баг с момента его появления (Git 2.5) до Git 2.15, что означает, что вы должны завершить любую работу, которую вы выполняете в добавленном рабочем дереве, в течение двух недель, а затем удалить добавленное рабочее дерево, но если вы делаете это в программе, вы закончите sh за минуты или в худшие часы, а не недели.

Низкоуровневый метод в ответе Кан будет наиболее эффективный (безусловно), но требует понимания внутренних деталей Git, по крайней мере, до некоторой степени.

1 голос
/ 16 января 2020

Вы можете использовать низкоуровневые сантехнические команды для создания BLOB-объектов, деревьев и коммитов. Например:

  1. hash-object создаст большой двоичный объект (из файла или стандартного ввода)
  2. mktree для создания дерева с большим двоичным объектом (ами)
  3. commit-tree для создания коммита с деревом
  4. update-ref для перемещения ссылки на новый коммит

Здесь есть небольшой базовый c пример здесь .

Другая идея состоит в том, чтобы использовать git notes или, по крайней мере, просто ссылку (или потерянную ветвь) вместо обычной ветки, чтобы сохранить информацию о проблеме отдельно и независимо от файлов и веток проекта.

0 голосов
/ 16 января 2020

Если вы используете конвейер Jenkinsfile с веб-хуками, у вас есть лучший контроль над пользовательскими задачами, которые вы хотите выполнить, в любом случае, если вы переключаетесь на другую ветку без фиксации, вы должны сохранить sh it.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...