Git子模块:修改外部库并推送到内部存储库&保持可更新性

时间:2015-11-11 14:35:21

标签: git git-submodules

我们想扩展一个开源项目并对其进行修改。但是想保留这个开源项目版本的可更新性。我们在我们的存储库中做了一些其他的事情(处理一些插件),但它并不重要......

git submodule允许我们拥有外部存储库并对其进行更新。但是花了一些时间我们想出如果我们修改外部库我们应该将它推送到它自己的存储库,我们不能将它推送到我们的存储库。换句话说,我们希望推动我们的服务器以团队形式工作。但也可以从库存储库中提取。 需要你的帮助......

2 个答案:

答案 0 :(得分:1)

git子模块对于来自不同来源的外部库并不是很容易使用。我希望在http://danielcestari.com/git-external/ git external,因为它更简单。

假设您拥有使用分叉开源库的/ your-project。您可以按如下方式配置项目:

git clone <your-git-project> your-project
cd your-project

挖掘开源库并将其链接到您的项目

git external add <forked-opensource-library-git-url> forked-opensrc-lib
git commit .gitignore .gitexternals -m "Setup to use forked library xyz"
git external init
git push

要将本地的所有更改推送到分叉库,请使用以下命令:

git external 'git push'

在团队环境中,您可以从远程提取所有更新,包括您的项目和分叉库:

git pull
git external update

当您想要将代码贡献给开源库时,您可以从分叉的lib发出拉取请求到原始的开源库

答案 1 :(得分:0)

Git子模块检出特定的提交,而不是分支,这使得难以修改子模块的内容。在使用了子模块一段时间之后,我放弃了它们,转而使用不同的方法:使用项目依赖关系管理。 这是使用Composer的示例布局:

code/               # base directory
+ main-project/     # a big project depending on 3rd party libraries
| + .git/           # remotes: origin=private repository
| + composer.json   # lists PHP dependencies: forked-lib
+ forked-lib/       # a 3rd party open source lib with custom modifications
  + .git/           # remotes: origin=original repository, private=private repository
  + composer.json   # custom modification: declares this as a composer package

如您所见,有两个项目:main-projectforked-lib,可以单独处理它们。

main-project指定forked-lib作为composer.json文件中的依赖项,如下所示:

{
  "name": "company-name/main-project",
  "require": {
    "company-name/forked-lib" : "2.x-dev",
  },
  "repositories": [
    {
      "type": "git",
      "url" : "https://private-repository/forked-lib.git"
    }
  ]
}

依赖项company-name/forked-lib具有版本2.x-dev,而Composer将.x-dev表示版本位于特定分支上(v2在这种情况下;请参阅{{ 3}}了解更多信息)。它将检查该分支并查找具有以下内容的composer.json文件:

{
  "name": "company/forked-lib",
  "version": "2.1"
}

当处理具有两个遥控器的forked-lib时,上游更改pull来自origin,并且本地v2分支针对它们进行了重新设置。所做的任何提交都会被推送到private存储库。这包括通过在composer.json中升级版本来标记新版本。

然后运行composer install将检出依赖关系和 将其存储在vendor/company/forked-lib中,如果版本增加,则运行composer update将更新依赖项。