Применить тайник с уже сохраненными файлами

Меня попросили написать сценарий для запуска в событиях после сборки в Visual Studio, который будет реагировать на сборку с обновлением вывода путем фиксации всех изменений, включая новые (неотслеживаемые) файлы, в локальной ветви "autocommit". Идея состоит в том, чтобы помочь ленивому разработчику часто создавать резервные копии кода, чтобы они не потеряли свою работу.

Мой текущий подход (см. Фрагмент ниже):

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

Моя проблема:

Если файл не отслежен в текущей ветви пользователя, но уже был автоматически зафиксирован в ветви автоматической фиксации, то git stash apply не удается перезаписать файл, отслеживаемый в ветке автокоммитов, с помощью неотслеживаемой версии в тайнике.

От git stash документация, не похоже, что есть какие-либо соответствующие аргументы, которые я мог бы использовать на apply позвони, чтобы обойти это. Я могу обнаружить неотслеживаемые файлы в текущей ветке перед сохранением, проанализировав результат git status --porcelain для строк, начинающихся с ??, но это не скажет мне, какие из них уже отслеживаются в ветке автокоммитов.

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

Вот соответствующий фрагмент моего текущего подхода:

git stash save --include-untracked -keep-index
git checkout autocommit
git stash apply
git add -A
git commit -m "Autocommit of build %VERSION%"
git checkout  %BRANCHNAME%
git stash pop

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

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

Он не соответствует обычной философии git, потому что он не предназначен для контроля исходного кода или совместного использования кода. Я просто хочу использовать git для предоставления снимков, к которым разработчик может вернуться, например, если они потеряют свой проект из-за повреждения файла. Это приведет к большому объему мелких коммитов с небольшой индивидуальной ценностью, и это нормально - на самом деле, это идеально для моих нужд.

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

1 ответ

Решение

Я вижу некоторые потенциальные проблемы с вашим подходом:

  1. git stash apply на autocommit может привести к конфликтам, которые требуют ручного разрешения. Это возьмет "автомат" из всей процедуры.
  2. Совершить на autocommit не гарантируется идентичность текущей рабочей копии, поскольку git stash apply выполняет слияние.

Следующая последовательность должна решить обе эти проблемы и обойти вашу первоначальную проблему.

git stash -u
git stash apply
git add -A
git commit -m "dummy"
git merge --no-ff autocommit -s ours
git checkout autocommit
git merge - --squash
git commit -m "Autocommit of build %VERSION%"
git checkout -
git reset --hard HEAD~2
git stash pop

Объяснение:

  1. Сохранить текущее состояние рабочей копии.
  2. Верните рабочую копию.
  3. Сцена все
  4. Сделайте фиктивный коммит на текущей ветке. Это будет скопировано в `autocommit 'и впоследствии удалено из текущей ветви.
  5. сливаться autocommit с нашими изменениями, чтобы облегчить перемещение изменений. ours Стратегия гарантирует, что результат слияния будет идентичен состоянию рабочей копии, которую мы хотим сохранить. Там никогда не будет конфликта слияния с этой стратегией. Это слияние не может быть сделано в autocommit потому что нет theirs стратегия.
  6. Перейти к autocommit ветка.
  7. Внесите изменения в ветку. --squash Вариант жизненно важен. Не выполняется фиксация, вместо этого все изменения размещаются.
  8. Зафиксируйте поставленные изменения.
  9. Вернитесь назад.
  10. Удалите фиктивный коммит и коммит слияния.
  11. Вернуть исходное состояние.

Результатом должен быть один коммит на autocommit представляющий рабочую копию.

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

Другие вопросы по тегам