Замена главной ветки в git и предотвращение перемотки вперед

У меня есть библиотека на github, и около года назад я полностью переписал приложение, которое не имеет обратной совместимости. Он находится на ветке под названием "структурированный". Сейчас большинство людей, которые устанавливают библиотеку, используют эту ветвь, и я хотел бы сделать ее ведущей и переместить текущий мастер в "наследство".

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

3 ответа

Решение

Я не думаю, что это возможно, если вы не реализуете хук, но это может не стоить того.

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

Нет никакого способа отклонить их, потому что ветки Git - просто метки: нет никакого способа сказать, что новый master ветвь отличается от старой.

Я думаю, что это плохая идея для клиента клонировать из master ветвь, если они не хотят, чтобы это сломало их. Для этого у вас должны быть ветки выпуска или теги, и тогда люди смогут клонировать их, и они будут знать, что у них есть стабильная ветка, которая может получать только обратно-совместимые обновления (в случае ветки) или никогда не меняться (в случае тег).

Что касается предупреждения, то оно также невозможно, потому что нет никакого крючка, который вы можете поставить на сервер, чтобы он запускался, когда кто-то извлекает данные с него (только для push вы можете). Вам просто нужно написать это четко на своей странице GitHub.

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

Что касается "переадресации" части вашего вопроса, вы всегда можете сделать что-то вроде этого в качестве первого коммита на новом мастере:

#ifndef IMPLEMENTED_STRUCTURED
#error "The master branch of project x has been completely rewritten and will break legacy applications.  If you are unable to update your application, switch to the legacy branch of this project and your code should continue working as before.  If you want to use the new structured code, simply add a preprocessor definition for IMPLEMENTED_STRUCTURED to get rid of this error message."
#endif

Это будет препятствовать тому, чтобы чей-либо код успешно компилировался, пока он не прочитает сообщение и не определится с тем, какие действия он хочет предпринять.

Надеемся, что если вы не используете C/C++, ваш язык обладает функциональностью, которая может обеспечить аналогичное поведение.

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