git рабочий процесс для обновления специально модифицированного программного обеспечения с открытым исходным кодом?

Наш университет предоставляет веб-хостинг отделениям кампуса на серверах, которыми мы управляем. Установка сторонних программ с открытым исходным кодом требует изменения прав доступа к файлам и кода в программе перед ее запуском. (Мы используем suEXEC, если вы знакомы.)

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

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

Каким должен быть мой рабочий процесс git, чтобы интегрировать новые изменения из ядра WordPress, но при этом сохранить наши старые пользовательские изменения?


person John Kary    schedule 29.09.2010    source источник


Ответы (2)


Я бы посоветовал сохранить ваши изменения в ветке и переустанавливать эту ветку на последнюю из WordPress при каждом обновлении. В сжатые сроки...

              +-- WordPress 1.0
              v
[master] --*--*
               \
[custom]        *--*--*     <- your customizations

Если вы хотите обновить WordPress, переключитесь на мастер и сделайте новую фиксацию с последним источником (или используйте git-svn для синхронизации с мастером):

              +-- WordPress 1.0
              |     +-- WordPress 1.1
              v     v
[master] --*--*--*--* 
               \
[custom]        *--*--*     <- your customizations

Теперь вы можете выполнить git rebase master custom, чтобы воспроизвести ваши изменения с последними, разрешая любые конфликты на этом пути. Тогда ваша временная шкала будет выглядеть так:

              +-- WordPress 1.0
              |     +-- WordPress 1.1
              v     v
[master] --*--*--*--* 
                     \
[custom]              *--*--*     <- your customizations

Обновление: Чтобы дать небольшое обоснование... Мне нравится этот подход к этой проблеме, потому что он обеспечивает четкое различие между кодом из WordPress и вашими настройками. Когда вы получаете новую версию WordPress, вас действительно не интересует «интеграция». Вы хотите повторно применить свои настройки к новой версии WordPress. На мой взгляд, эту перенастройку проще всего выполнить фиксация за фиксацией через перебазирование. Любые конфликты означают, что настройка, скорее всего, сломалась, поэтому старая фиксация настройки в любом случае является мусором — лучше просто исправить проблему в ее источнике и сохранить обновленную историю чистой.

После того, как master обновится, а custom будет перебазирован и отправлен, соавторы просто перебазируют свою незавершенную работу относительно последней.

Это всего лишь мое мнение, как твердого сторонника перебазирования > слияния. Прелесть Git в том, что редко бывает один правильный ответ. Просто продолжайте корректировать, пока не найдете то, что вам подходит.

person dahlbyk    schedule 29.09.2010
comment
Я бы рекомендовал против этого, так как перебазирование может вызвать много проблем. Он теряет историю (вы не можете вернуться к версии, которую вы на самом деле развернули ранее, и вы не можете сказать, когда вы сделали какие слияния), и постоянное перемещение вашей рабочей ветки значительно усложняет вашу совместную работу. другие люди, так как теперь им также нужно будет перебазировать все, что они делают. Перебазирование — это то, что лучше всего подходит для изменений, которые еще никому не были переданы или которые известны как изменчивые, а не для перебазирования всей вашей истории в восходящей ветке каждый раз, когда появляется новый выпуск. - person Brian Campbell; 30.09.2010
comment
Перебазирование может вызвать проблемы, если вы не сможете общаться, но это вполне управляемо. История теряется только в том случае, если вы не сохраняете ссылку на коммит — просто пометьте развернутую версию, и вы ничего не потеряете. - person dahlbyk; 30.09.2010
comment
В нашем случае перебазирование кажется хорошим решением, поскольку мы делимся исходным кодом только в виде архива. Никакие другие разработчики, использующие конечный продукт, не вносят изменения в ядро, как мы, поэтому нет необходимости делиться ими с другими. - person John Kary; 01.10.2010

Мой общий подход состоит в том, чтобы иметь две ветки, upstream и master. Создайте свой репозиторий (который запустит вас в ветке master), проверьте последнюю копию исходного кода, который вы используете, а затем создайте ветку upsteram с git branch upstream. Кроме того, создайте тег, указывающий, какую исходную версию вы импортировали, например git tag wordpress-1.0. Я обычно использую для этого облегченные теги (без каких-либо аннотаций, просто указатель на ревизию).

[wordpress-1.0]               Key: [tag]
v                                  branch
* <- upstream                      * commit
^- master 

Теперь, пока вы все еще находитесь в ветке master, скопируйте свои изменения и зарегистрируйте их. Теперь у вас есть две ветки, upstream, которая содержит нетронутый основной исходный код, и master, которая содержит ваши изменения, с историей, показывающей, какие изменения вы сделали. до upstream.

[wordpress-1.0]
v
* <- upstream
 \
  +--* <- master 

Сделайте все свои модификации в ветке master.

[wordpress-1.0]
v
* <- upstream
 \
  +--*--*--* <- master 

Когда появится новая версия исходного кода, проверьте свою ветку upstream (git checkout upstream), очистите все, кроме каталога .git, и скопируйте новую версию исходного кода. Используйте git add -A, чтобы подготовить все изменения в исходной версии, зафиксировать их и пометить.

[wordpress-1.0]
|  [wordpress-1.1]
v  v
*--* <- upstream
 \
  +--*--*--* <- master 

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

[wordpress-1.0]
|  [wordpress-1.1]
v  v
*--*--------+ <- upstream
 \           \
  +--*--*--*--* <- master 

Таким образом, все ваши изменения происходят на master, и все исходные версии фиксируются точно так же, как и на upstream. Это позволит вам проще всего увидеть, чем именно ваш код отличается от исходной версии, поможет отслеживать, какие изменения вы уже объединили с исходной версией, и так далее.

[wordpress-1.0]
|  [wordpress-1.1]
|  |           [wordpress-2.0]
v  v           v
*--*--------+--*-+ <- upstream
 \           \    \ 
  +--*--*--*--*----*--* <- master 

Надеюсь, это поможет, дайте мне знать, если у вас есть дополнительные вопросы.

person Brian Campbell    schedule 29.09.2010
comment
Технически это работает, но кажется более логичным каждый раз повторно применять наши изменения к новейшему исходному коду, поэтому перебазирование звучит как лучший вариант, чем слияние. - person John Kary; 01.10.2010