Использование git в качестве системы управления плагинами

#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 в качестве менеджера плагинов.