使用git推送项目_使用就地推送访问的Git子模块更轻松地工作– Git Tricks#2

使用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推送项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值