Применить тайник с уже сохраненными файлами
Меня попросили написать сценарий для запуска в событиях после сборки в 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 ответ
Я вижу некоторые потенциальные проблемы с вашим подходом:
git stash apply
наautocommit
может привести к конфликтам, которые требуют ручного разрешения. Это возьмет "автомат" из всей процедуры.- Совершить на
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
Объяснение:
- Сохранить текущее состояние рабочей копии.
- Верните рабочую копию.
- Сцена все
- Сделайте фиктивный коммит на текущей ветке. Это будет скопировано в `autocommit 'и впоследствии удалено из текущей ветви.
- сливаться
autocommit
с нашими изменениями, чтобы облегчить перемещение изменений.ours
Стратегия гарантирует, что результат слияния будет идентичен состоянию рабочей копии, которую мы хотим сохранить. Там никогда не будет конфликта слияния с этой стратегией. Это слияние не может быть сделано вautocommit
потому что нетtheirs
стратегия. - Перейти к
autocommit
ветка. - Внесите изменения в ветку.
--squash
Вариант жизненно важен. Не выполняется фиксация, вместо этого все изменения размещаются. - Зафиксируйте поставленные изменения.
- Вернитесь назад.
- Удалите фиктивный коммит и коммит слияния.
- Вернуть исходное состояние.
Результатом должен быть один коммит на autocommit
представляющий рабочую копию.
Имейте в виду, что этот скрипт, вероятно, будет совершать много мусора (создавать файлы). autocommit
Ветка также будет сильно отличаться для разных разработчиков. Я рекомендую, чтобы он оставался локальным, чтобы избежать вздутия исходного репо. Если вам нужно нажать на него, попробуйте дать каждому разработчику свое собственное имя ветки, чтобы избежать конфликтов.