Нужно GIT предложение рабочего процесса - PullRequest
2 голосов
/ 22 июня 2010

Последние пару недель я изучал GIT, пытаясь получить контроль над кодом моей команды.К сожалению, код, с которым мы работаем, является проприетарным языком с некоторыми особенностями, которые мешают мне найти достаточно практичный рабочий процесс для реализации.Тем не менее, я, вероятно, не знаю всех возможностей GIT, поэтому я прошу у вас, ребята, предложения.Я разделю этот пост на три части: 1) как мои файлы;2) рабочий процесс, который мы уже выяснили;3) варианты, которые я считаю на будущее.

Мои файлы тогда;

Как я уже сказал, это проприетарный язык сценариев, в котором внутри самого кода вы найдететеги относительно конфигураций (серверы, БД и другие вещи).Я знаю, это может звучать странно, но технически этот код является большим сложным файлом конфигурации.Ну, это не может быть изменено, пока давайте просто оставим это.

У меня также есть два различных окружения: dev и prod, и я предполагаю, что его использование очевидно.Из-за странного подхода к коду, если вы сравните скрипт в dev с тем же, что и в prod, вы увидите:

prod:

CodeCode += Code(0)
Code{1} ...
CodeConfig = "ConnectionToProducionDB"
SomeMoreGenericCode.doSomething()
(...)

А в dev это будет выглядеть так:

CodeCode += Code(0)
Code{1} ...
CodeConfig = "GoToSomeDevDB"
SomeMoreGenericCode.doSomething()
(...)

Это было бы в отношении файлов.

Теперь, что было показано;

На первый взгляд, мне показалось, что классическая позволяет разветвлять ситуацию , и я справился.

[create a folder and init it]
[copy my code from production and add/commit it]
$ git checkout -b dev
[change these lines with 'CodeConfig' to the dev settings]
[go happy coding and commiting]

Через некоторое время кодированиеи испытания сделаны, и пришло время объединиться с производством.Вот когда начинается проблема.

Простой git merge dev (из моей основной ветки) слит коды в основном нормально, но конфиги также будут перенесены в главную ветку, так как из PIT GIT это один изобновления в самом коде.Хотя в этом коротком коде это не было бы проблемой, в реальной ситуации я мог бы переконфигурировать десять или двадцать источников, и откат по одному не всегда был приятной (и не надежной) задачей.

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

Я пробовал пару разных вещей, чтобы решить это, но безуспешно.Кажется, что слияние GIT слишком умно для меня: (

Например, *.xml merge=Unset в мой файл .gitattributes. Или пользовательский драйвер слияния в ~ / .gitconfig, пытающийся вызвать сбой автоматического слияния(хотя я не уверен, правильно ли я это понял).

Возможные решения, которые я подумал;

Как я уже сказал, я, вероятно, не знаю всех функций GIT, поэтому мойварианты связаны с теми, кого я знаю. Я ценю ваши инновации;)

Я думаю, что самый простой способ был бы, если бы я мог отключить любое автоматическое слияние и сделать все вручную (коды не такие большие, и явсе равно придется в это разобраться).После этого я бы создал простой драйвер слияния, который передавал бы все изменения кода (не только конфликты) чему-то вроде WinMerge или Kdiff3, где я выполнял свою работу.К сожалению, мне так и не удалось добиться этого.

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

  1. init repo proj1
  2. копирование prod файлов
  3. первое добавление / принятие
  4. $ git checkout -b dev
  5. настройка dev настройки
  6. код / ​​цикл разработки
  7. копирование файлов разработки в tmpDevDir
  8. $ git checkout master
  9. использование WinMerge для сравнения tmpDevDir с proj1[master branch] и применять только желаемые изменения
  10. фиксировать proj1[master branch]
  11. $ git merge dev
  12. конфликты слияния, где это необходимо
  13. $ git diff HEAD HEAD^ для проверки результата слияния ивернуть объединенные конфиги
  14. $ git commit -am 'final commit for the production code'

И хорошо ... не приятно.

У кого-нибудь есть идеи для более практичного рабочего процесса или других команд, которые быпомочь?

спасибо большое,

f.

1 Ответ

4 голосов
/ 22 июня 2010

Это классическая ситуация с «файлом конфигурации» (даже если ваши файлы не являются точно файлом конфигурации).

Обычное решение заключается в:

  • поместите только имена переменных в ваш код
  • извлекает значения, специфичные для каждой среды, в свои файлы
  • версия скрипта, способного генерировать реальный код (тот, в котором имена переменных были заменены их значениями в зависимости от текущей среды)
  • установить драйвер фильтра (см. Git ProBook ) для автоматизации подстановки переменных (то есть «новые файлы» не создаются: только текущий код изменяется на git checkout - - переменная заменена на значения - и "очищена" на git commit - значения заменены на переменные, а значения возвращены в отдельный файл конфигурации, если они были изменены)

alt text

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

Просто:

yourCode1.code
yourCode2.code
...
yourCoden.code
devValues.txt
prodValues.txt
scriptPutValuesInCode.sh
scriptCleanCodeFromValues.sh

и фильтр "нечеткое"

*.code  filter=setOrCleanValues

git config --global filter.setOrCleanValues.smudge /path/to/scriptPutValuesInCode.sh
git config --global filter.setOrCleanValues.clean /path/to/scriptCleanCodeFromValues.sh
...