首页 > 解决方案 > 使用 git 作为插件管理系统

问题描述

在设计我的一个新项目时,我想出了将其git用作插件管理系统的想法。一般的想法是主项目将是一个git存储库,插件将是它的分支。最酷的是它可以git自动管理诸如合并冲突和拉和推之类的事情,同时是大多数人熟悉的工具。

如果有人想安装插件,他们可以克隆一个 fork 而不是主存储库。问题是这只允许一次安装一个插件。即使两个插件修改了两个完全不同的文件并且没有冲突。

理想情况下,我想要的是能够跟踪单个主存储库,但也能够同时从多个插件存储库中提取更改。如果主 repo 中的文件被更改并且它不与任何插件所做的任何更改冲突,它应该只是正常更新,而不必先更新 fork。

基本上,我会将每个插件想象成某种对单个代码行所做更改的目录,只要没有冲突,就可以将其应用于主存储库的任何版本。

举个例子:假设主仓库有一个名为的文件logger.h,如下所示:

void
log(const std::string& message) noexcept
{
    const prefix = "LOG: ";
    log << prefix << message;
}

一个名为的插件ImprovedLogger可能会将此文件更改为如下所示:

void
log(const std::string& message, const std::string& source = "") noexcept
{
    const prefix = "LOG: ";
    log << prefix << source << message;
}

同时,另一个名为的插件LoggerPrefixRemover会将文件更改为:

void
log(const std::string& message) noexcept
{
    const prefix = "";
    log << prefix << message;
}

如果同时安装了两个插件,则文件将如下所示:

void
log(const std::string& message, const std::string& source = "") noexcept
{
    const prefix = "";
    log << prefix << source << message;
}

然后,假设主存储库将文件更改为:

bool
log(const std::string& message) noexcept
{
    const prefix = "LOG: ";
    log << prefix << message;

    return log.good();
}

然后,用户应该能够拉取新的主存储库并获得如下所示的文件,而无需从主存储库更新分支/插件:

bool
log(const std::string& message, const std::string& source = "") noexcept
{
    const prefix = "";
    log << prefix << source << message;

    return log.good();
}

是否可以创建诸如系统使用git

标签: gitpluginsdiff

解决方案


推荐阅读