#git #plugins #diff
Вопрос:
При разработке моего нового проекта мне пришла в голову идея использовать git
его в качестве системы управления плагинами. Общая идея заключалась бы в том, что основным проектом был бы git
репозиторий, а плагины были бы его развилками. Самое классное в этом то, что git
автоматически управляет такими вещами, как конфликты слияния, вытягивание и выталкивание, будучи знакомым большинству инструментом.
Если бы кто-то хотел установить плагин, он мог бы просто клонировать вилку вместо основного хранилища. Проблема в том, что это позволяет устанавливать только один плагин одновременно. Даже если два плагина изменяют два совершенно разных файла и конфликтов нет.
В идеале я хотел бы иметь возможность отслеживать один основной репозиторий, но также иметь возможность извлекать изменения из нескольких репозиториев плагинов одновременно. Если файл в основном репозитории изменен и он не противоречит каким-либо изменениям, внесенным каким-либо из плагинов, он должен просто обновляться в обычном режиме без необходимости сначала обновлять вилки.
В принципе, я бы представил каждый плагин как своего рода каталог изменений, внесенных в отдельные строки кода, которые могут быть применены к любой версии основного репозитория, если нет конфликтов.
Чтобы привести пример: Предположим, что в главном репозитории есть файл с именем logger.h
, который выглядит следующим образом:
void
log(const std::stringamp; message) noexcept
{
const prefix = "LOG: ";
log << prefix << message;
}
Плагин под названием ImprovedLogger
может изменить этот файл, чтобы он выглядел следующим образом:
void
log(const std::stringamp; message, const std::stringamp; source = "") noexcept
{
const prefix = "LOG: ";
log << prefix << source << message;
}
В то же время другой вызванный плагин LoggerPrefixRemover
изменил бы файл на этот:
void
log(const std::stringamp; message) noexcept
{
const prefix = "";
log << prefix << message;
}
Если бы оба плагина были установлены одновременно, файл выглядел бы так:
void
log(const std::stringamp; message, const std::stringamp; source = "") noexcept
{
const prefix = "";
log << prefix << source << message;
}
Затем, допустим, основное хранилище изменило файл на этот:
bool
log(const std::stringamp; message) noexcept
{
const prefix = "LOG: ";
log << prefix << message;
return log.good();
}
Затем пользователь должен иметь возможность извлечь новый основной репозиторий и получить файл, выглядящий следующим образом, без необходимости обновления вилок/плагинов из основного репозитория:
bool
log(const std::stringamp; message, const std::stringamp; source = "") noexcept
{
const prefix = "";
log << prefix << source << message;
return log.good();
}
Можно ли создать такую систему с помощью git
?
Комментарии:
1. С помощью Git можно многое сделать … но мое эмпирическое правило таково: если вы заполняете пробел в том, чтобы заставить Git действовать как _____ с помощью чего-либо, кроме системы управления версиями , вы движетесь в неправильном направлении. 🙂 Если у вас есть идея для менеджера плагинов, напишите ее на каком-нибудь языке, а затем, возможно, используйте Git внутри нее в качестве системы контроля версий. Но не пытайтесь использовать сам Git в качестве менеджера плагинов.