使用git推送项目
了解如何通过直接从主存储库推送到子模块来解决问题,同时使项目易于被外部贡献者克隆。
介绍
Git子模块机制非常方便,可以将糟糕的相关依赖软件的源代码保存在一个Git存储库中,同时将它们的开发分开。 它与Unix世界中的符号链接类似,但是具有引用以前版本的能力。 它在使用源代码集成(而不是共享库)的项目中很流行,或者通过简化多个存储库中的相关更改来加快开发速度。 这不是唯一可行的解决方案–例如,Gradle提供了一种复合构建机制。 Monorepo是另一种方法,但是它有其自身的局限性,并且在由不同人员/团队开发的FOSS项目中使用它非常成问题。
和往常一样,我在一个项目中遇到了这种情况。 作为自动代码测试和持续交付的狂热爱好者,前一段时间,我一直在努力提高我(自动发布的) gradle-nexus-staging-plugin的可靠性。 在每次提交之后(也在发布之前),我想执行端到端测试,以验证插件能够通过发布过程将一个简单(但真实)的项目传递给Maven Central(又名The Central Repository) )。
我可以将测试项目移至插件存储库,但是-很好-它是一个独特的项目,也可以单独发布或替换为其他项目。 此外,测试释放它的两个变体很方便,可以将其保存在我的根存储库中“安装”两次的两个分支中。
gradle-nexus-staging-plugin ├── src │ ├── funcTest │ │ ├── groovy │ │ │ └── ... │ │ └── resources │ │ └── sampleProjects │ │ ├── nexus-at-minimal (submodule - master branch) │ │ │ └── ... │ │ ├── nexus-at-minimal-publish (submodule - publish branch) │ │ │ └── ... │ │ └── ... │ ├── ...
问题(又名挑战)
gradle-nexus-staging-plugin
包含一个单独的gradle-nexus-staging-plugin
nexus-at-minimal
模块nexus-at-minimal
。 在GNSP中使用新的高级功能时,需要调整验收测试项目。 为了使开发更顺畅,能够直接从主项目的工作副本中提交对从属项目的更改非常有用。 开箱即用。 但是,稍后我们也应该直接将它们推回该依赖项目的单独回购中(通过进入子模块并调用git push
或-使用git push --recurse-submodules=on-deamand
从主存储库推送时使用git push --recurse-submodules=on-deamand
参数)。 然后,从长远来看,我们会遇到一些不便。
让我们首先定义一个通过SSH连接的子模块路径:
[submodule "src/funcTest/resources/sampleProjects/nexus-at-minimal" ]
path = src /funcTest/resources/sampleProjects/nexus-at-minimal
url = git@gitlab.com:nexus-at /nexus-at-minimal .git
通常,它可以正常工作,并且允许推送。 但是,任何试图克隆该仓库(并初始化子模块)的非开发人员都会得到:
... git@gitlab.com: Permission denied (publickey). fatal: Could not from remote repository. read from remote repository. Please make sure you have the correct access rights and the repository exists.
在开放源代码(FOSS)开发中,这非常糟糕,因为该项目是公开可用的,因此鼓励其他人下载(克隆)该项目,进行构建并做出贡献。
解决先前错误的明显方法是切换到HTTPS:
[submodule "src/funcTest/resources/sampleProjects/nexus-at-minimal" ]
path = src /funcTest/resources/sampleProjects/nexus-at-minimal
url = https: //gitlab .com /nexus-at/nexus-at-minimal .git
但是,然后,为了允许开发人员将更改直接提交到子模块,需要通过单独的HTTPS身份验证,在大多数情况下,完全不使用SSH身份验证,而是需要使用访问令牌独立配置HTTPS身份验证。
透明解决方案
为了使外部贡献者满意,开发人员可以为每个克隆项目手动将.gitmodules
的URL从HTTPS更改为SSH。 但是,这很繁琐。 更好的解决方案是使用pushInsteadOf
。 对于上述示例,开发人员只需将其添加到全局~/.gitconfig
配置文件中:
[url "git@gitlab.com:nexus-at/" ]
pushInsteadOf = https: //gitlab .com /nexus-at/
它有效地覆盖了推送URL,以在GitLab / GitHub中的整个组中使用SSH而不是HTTPS,还覆盖了子模块(默认情况下保留HTTPS,即外部贡献者友好方案)。
摘要
URL重写和条件配置(在第一部分中介绍 )只是Git中可用选项的一部分,以使开发更加灵活和简单。 简单,假设我们已经找到了所需的功能并学习了如何使用它;-)。
根据Mohamed Hassan的工作制作的主导照片, Pixabay ,Pixabay许可。
翻译自: https://www.javacodegeeks.com/2019/09/easier-work-git-submodules-with-in-place-push-access-git.html
使用git推送项目