日前Gitlab博客宣布发布GitLab的又一个里程碑大版本120。该版本主推基于全栈DevOps的全供应链安全DevSecOps,从而实现真正意义上的开发,运维和安全的有机集成。另外代码审阅一直是Gitlab比较重点突击加强的功能新版本在可视化方面做了很多事情,可以极大快速提高代码审阅流程。另外还有项目依赖列表、基于IP ACL限制能安全功能方面的功能,更多的功能请跟着虫虫一起 探索 。
GitLab在用户级别整个单个用户的合并请求并自动创建审阅预览界面(Review App)。该功能可以让每一个用户都能知道设计或UX是如何改变的。
GitLab 120在Review App中加入将可视化审阅工具直,拓展变更审议的能力。通过一个小代码片段,用户可以使设计人员,产品经理和其他相关人员能够快速提供有关合并请求的反馈,而无需离开应用程序。
ULTIMATE版本新版本在项目左侧边栏菜单可以列出项目的依赖关系列表(有时称为物料清单或物BOM)。
BOM可以表明项目中包含哪些组件,安全团队和合规性团队通常会审查这些依赖的组件确保没有安全问题。可以浏览相关报告,并且支持以JSON格式导出。
限制Gitlab界面的访问一直都是大家很急需的功能,新版本商业版本中支持在Gitlab中进行IP(段)限制,加入黑名单机制限制访问IP,设置更加灵活,可以自建实例可以在组级别上设置限制。(当然可以通过nginx进行IP限制,方法需要可以联系)
在GitLab 120中,Web IDE中的更改可以自动同步到Web终端,在提交更改之前,可以在Web终端中对其进行测试。该功能可以降低新贡献者的入门门槛,因为他们无需安装项目的本地依赖项即可查看,编辑和测试。
通过GitLab的Kubernetes集成部署JupyterHub是一种简单方便地Jupyter Notebook环境构建。利用该环境可以创建和实时代码分享,可视化、运行以后books文件。
GitLab 120中如果通过Gitlab、K8s部署JupyterHub到集群时,会自动安装配置JupyterLab的Git扩展。然后通过Git对环境进行完全版本控制,在Jupyter中执行Git命令。可以通过左侧面板上的Git选项卡或通过Jupyter的命令行提示符执行。
通过extends关键字,把不同内容分割为不同文件在引入,可以保持用户CI/CD配置文件整洁。在GitLab 120中,可以允许用户在单个作业中包含多个扩展片段来改进此功能,并且通过多个扩展,可以实现整洁简化的CI配置(处女座管理员必备)。
在GitLab 120中新添加了GitLab CI/CD作业扩展和折叠日志的输出。用户可以更轻松地调试作业中的某些步骤,并在需要时浏览整体步骤。
gitlab公开了漏洞数据库项目(/gitlab-org/security-products/gemnasium-db)。用户可以查看具体条目并验证感兴趣的漏洞,也支持用户一起参与完善该咯多干数据库。
依靠LDAP的组织通常需要于GitLab同步以进行权限管理。在GitLab 120中,实例可以阻止具有实例级设置的非管理员在LDAP之外进行权限更改。通过该方法,具有合规性的组织可以使用这个选项来确保LDAP中的权限映射到Gitlab实例,而不能由非实例管理员的用户修改。
GitLab Ultimate 119(功能标志)中引入的GitLab Insights现在在GitLab Ultimate 120中默认启用。
可以统计项目中重要的数据的统计,比如给定时间段创建/关闭的问题,合并请求的平均合并时间等等。
在GitLab 118中,引入了从上游桥接作业触发下游管道的功能。还介绍了将变量传递给下游管道的基本支持。在GitLab 120中新增加支持将当前环境变量传递到下游管道。可以允许用户向下游管道提供上下文以及提交,合并请求或触发它的管道的其他细节。
在GitLab 1111中,启动了依赖代理的MVC,它允许用户下载和缓存Docker镜像,以便更快,更可靠地下载。在GitLab 120中,在组级别默认启用了该功能。
Container Registry API允许GitLab用户以编程方式轻松管理注册。GitLab 120中更新了权限模型,以允许开发人员删除标签。
在GitLab 120中,当重新打包Git存储库时,bitmap缓存将保存在bitmap索引中。缓存提高了重打包性能。(350之前的 JGit 版本与bitmap不兼容)
在此版本之前,GitLab无服务器功能只能在通过GitLab安装的Knative上使用。在GitLab 120中以安装的Knative被GitLab Serverless利用。可以手动添加现有Knative集群,将相关的无服务器模板添加到项目中。所以GitLab Serverless可与托管的Knative产品一起使用,例如Google的GKE上的Cloud Run或在IBM托管的Knative服务。
从GitLab 120开始,可以直接从GitLab的环境仪表板中提供并轻松访问外部仪表板。
现有的用于讨论合并请求和问题的设计涉及许多框和边界,难以对对话进行跟踪。在新版本中,对此做了重新设计来增强用户的讨论体验。
动态应用程序安全性测试(DAST)不再需要在Docker中使用Docker来运行。因此,DAST Docker镜像(3GB)现在将在Runners上缓存。(注意镜像每周更新一次,因此缓存将在每周一失效)。
在120中,添加了为群组通知设置电子邮件地址的功能。可以让用户将组通知发送到不同的电子邮件地址。例如,工作组的工作电子邮件地址和个人组的个人电子邮件地址(个人设置项目里面有电子邮件菜单用以添加邮件地址)。
在解除扫描程序发现的漏洞时,新添加一个字段可用于添加详细说明此漏洞被解除的原因。
这将使安全团队和开发人员能够查看 历史 记录并了解未修复项目的原因。
由于审计等原因可能希望确保项目(可能包括存储库中的重要代码)只能存档,而不会被删除和永久丢失。新版本可以通过实例级设置来防止非管理员删除项目。
自GitLab 89起,GitLab CI/CD通过在作业定义中指定GIT_DEPTH变量来支持浅git克隆。新版本中添加了在项目级别设置clone深度的功能,项目维护者可设置默认为浅层克隆。浅Git克隆比每次克隆整个Git存储库更快,如果CI/CD作业设置为构建最新代码,通常浅的克隆就足够了。
同样在GitLab 120中,默认情况下,在GitLab中创建的新项目在创建时的GIT_DEPTH设置为50。该默认设置将帮助用户使用GitLab CI/CD实现更快的克隆和构建时间,同时仍允许高级用户在不同类型的CI/CD用例需要时更改此设置。
Fork工作流程创建一个副本,用户修改该副本并合并到上游项目,从而轻松地加速了协作,这也是Github等Git项目得以流行的功能。但是对一个热门的项目,可能会存在数以千计的副本,存储这些副本需要消耗大量的服务器资源。
GitLab 120中,实例管理员可以使用object_pools功能标志启用Git对象重复数据删除。启用后,创建公共分支也将创建对象池并使用objects/info/ alternates来减少分叉的存储要求。对象重复数据删除需要启用散列存储,并且父项目要使用散列存储。现有的forks还没有自动迁移到对象池。在后续即将将发布的版本中,会通过直接在重复数据删除状态下创建fork来实现快速fork。当前版本还需要首先创建fork,然后进行重复数据删除。
从2019年5月30日起,GitLab在线git服务已启用对象重复数据删除。自建实例但默认情况下关闭该功能,因为在获取时会显示重复警告。
手动添加Kubernetes集群需要输入多个数据点,并且容易出错。为了在手动添加集群解决访问和权限问题,kubernetes集成支持将验证API URL的可访问性以及集群令牌和CA证书的有效性。
在GitLab 120中,过Zoom电话会议轻松与团队成员就问题进行协作。在问题说明中粘贴会议链接。 GitLab将检测链接并在标题下方的顶部显示"加入Zoom会议"按钮,使其显示给所有协作者。
用户能够在问题中定义任务,并且该信息在整个应用程序的各个位置会显示。在GitLab 120中,用户可以通过API返回任务进度信息。
之前版本用户无法从问题API获取详细的问题统计信息。在GitLab 120中添加了返回所有、已关闭和已打开状态的问题统计的功能。
GitLab 120中Omnibus改进包括:
引入Mattermost 511,这是一个开源的Slack替代品,其最新版本包括一个新的远程CLI工具,及更多功能。此版本还包括安全更新,尽快升级到新版本来。
默认情况下启用JSON日志记录。
omnibus-gitlab默认会启用Grafana服务。此外,现在已经实现GitLab和Grafana自动启用OAuth身份验证。
使用一些直接检测的ruby指标改进了GitLab指标
GitLab还同期发布了GitLab Runner 120。主要变化如下:
Docker Credentials帮助程序支持;
在注册时为跑步者添加access_level配置;
允许Kubernetes Executor配置Pod安全上下文;
为新注册的Windows shell执行程序设置PowerShell默认值;
支持Windows docker卷配置。
同时GitLab Runner 120版本,也删除了一些此前弃用的东西:
删除已弃用的clone/fetch命令
删除已弃用的git clean策略
删除对已弃用的metrics_server设置的支持
删除对K8S的已弃用入口点配置的支持
删除对已弃用的S3缓存配置的支持
删除对已弃用分发的支持
删除旧的docker helper image命令
可以在GitLab Runner的CHANGELOG中找到所有更改的列表。
GitLab 120在性能方面的一些改进包括:
epics列表页面系能做了性能大幅度优化。
避免为Elasticsearch结果访问数据库,避免两次针对搜索结果点击Elasticsearch。
批量提交文档到ElasticSearch索引;
缓存在提交消息中呈现Markdown以提高列表提交的性能;
提高每次推送的存储库大小限制检查的性能;
使用长描述加载问题或合并请求时提高性能;
通过建议的更改提高合并请求的性能;
重新打包Git存储库时,通过使用delta岛来提高性能并减少克隆的CPU使用率;
提高监控图表的性能;
修复ListLastCommit RPC上的Git N+1;
使用--perl-regexp提高Git代码搜索性能;
通过修复Git N + 1来提高JobsController的性能;
GitLab的主要维护版本版本这中,删除对GitLab 9x的支持。最低支持版本提高到GitLab 100。
启用日期:2019年6月22日
在GitLab 120,GitLab Geo需要使用Hashed Storage来缓解辅助节点上的竞争条件。请使用"sudo gitlab-rake gitlab:geo:check"检查是否启用了Hashed Storage并迁移了所有项目。
迁移日期:2019年6月22日
在GitLab 120中,Geo需要PostgreSQL外部数据包装器,将最低PostgreSQL版本提高到96。 GitLab Geo使用PostgreSQL Foreign Data Wrapper来查询来自不同PostgreSQL实例的数据。这是Geo Log Cursor所必需的,可以显著提高了某些同步 *** 作的性能。 Foreign Data Wrapper还提高了Geo节点状态查询的性能。对于大型项目,遗留查询具有不可接受的性能。
迁移日期:2019年6月22日
在GitLab 121中将删除Kubernetes部署选择器的应用程序标签匹配(删除最初计划为120)。在GitLab 1110的一部分,gitlab引入了一种新的匹配机制,它使用appgitlabcom/app和appgitlabcom/env来展示部署板上的部署。要在部署板中查看这些部署,需要做的就是推送新部署,GitLab将使用新标签进行部署。
移除日期:2019年6月22日
新的KUBE_INGRESS_BASE_DOMAIN环境变量在GitLab 118部分引入。不再需要使用AUTO_DEVOPS_DOMAIN来定义多个域,因为现在可以在群集页面上单独定义这些域。
移除日期:2019年6月22日
在GitLab 121中计划删除实例级Kubernetes服务模板,以支持在GitLab 1111中引入的实例级集群功能。
作为升级到GitLab 120的一部分,任何使用服务模板的自建gitlab实例都将迁移到实例级集群。
移除日期:2019年6月22日
在GitLab 120中完全删除了对skip_auto_migrations文件的支持。该文件在GitLab 106中已被弃用。
移除日期:2019年6月22日
GitLab 120中完全取消了对Prometheus 1x的支持。
移除日期:2019年6月22日
openSUSE 423将于2019年6月30日到期。gitlab将会在122中放弃支持。
移除日期:2019年8月22日
GitLab 119开始GitLab Runner一直在使用一种新方法来克隆/获取存储库。在目前版本,如果不支持新方法,GitLab Runner将使用旧方法。
在GitLab 110中,我们更改了为GitLab Runner配置度量服务器的方式。 metrics_server已被删除,转而使用GitLab 120中的listen_address。
在113中,GitLab Runner开始支持多个缓存提供程序。这导致特定于S3的配置的新设置。
GitLab 120中将不再提供这些路径。对于从119+以上的用户,直接升级不会有任何影响。
弃用日期:2019年6月22日
在GitLab 114中,GitLab Runner引入了一个功能标志FF_K8S_USE_ENTRYPOINT_OVER_COMMAND。在GitLab 120中,将删除这些功能标志。
移除日期:2019年6月22日
GitLab Runner中一些Linux发行版已达到End of Life支持。GitLab 120中,GitLab Runner不再提供专门分发包给过期的Linux发行版。
弃用日期:2019年6月22日
作为添加对Windows Docker执行程序的支持的一部分,需要弃用一些用于帮助程序镜像的旧命令。在GitLab 120中,GitLab Runner开始使用新命令。这仅影响覆盖帮助程序镜像的用户。
迁移日期:2019年6月22日
使用GitLab Runner 1110引入了一种配置Runner如何执行git clean命令的方法。新的清理策略删除了git reset的使用,并在checkout之后删除了git clean命令。在GitLab Runner 120中,GitLab Runner放弃了对旧版清理策略的支持,并删除了使用功能标志设置恢复该功能的方法。
弃用日期:2019年6月22日
许可证管理做了重新命名以便更好地与GitLab 120中的常见行业用语一致。许可证合规性的目的是分析应用程序,跟踪第三方组件(如库和外部依赖项)使用的许可证,并检查它们是否与项目的许可模型兼容。许可证合规性安全软件组合分析组的一部分。
迁移日期:2019年6月22日
命令行参数--auth-first-page,不再受支持,需要删除此参数。
DEP_SCAN_DISABLE_REMOTE_CHECKS标志变量,不再受支持,需要删除此参数。
GITLAB_FEATURES环境变量中的sast_container值,必须更改为container_scanning。
迁移日期:2019年6月22日
新版本不再更新在项目管道中配置安全功能时使用的文档中安全手动配置代码段。请使用include: template: Dependency-Scanninggitlab-ciyml配置中使用Secure的include。
弃用日期:2019年6月22日
为了缓解这种情况,默认情况下将禁用前进3DES。对于现代浏览器的用户,这不应该改变任何内容,但是在Windows XP *** 作系统上运行的Internet Explorer版本7和8的某些用户可能会受到影响。
弃用日期:2019年6月22日
GitLab 120是支持MySQL(和MariaDB)的最后一个版本。用户需要迁移到PostgreSQL才能使用未来版本。 MySQL已被弃用,对它的支持以前仅限于Enterprise Edition Starter和Premium。
弃用日期:2019年7月22日
GitLab 121中的UI中会删除这些设置,该策略已在GitLab 1111中的gitlabyml中提供。此外,还可以定义Sentry环境,以区分开发,stagin和生产等多个部署。
迁移日期:2019年7月22日
当我们在GitLab 116中引入组级项目模板时,将该功能扩大化了。通过给予低于Silver/Premium的现有用户/实例三个月的宽限期来修复GitLab 1111中的这个错误。2019年8月22日,此宽限期将到期,组项目模板将需要Silver/ remium或更高版本。
迁移日期:2019年8月22日
如果使用Python 2的用户在开始使用GitLab 122时进行自我管理,则需要将CI变量LM_PYTHON_VERSION设置为"2"。使用Python 3的用户现在可以将CI变量LM_PYTHON_VERSION更改为"3"。
迁移日期:2019年8月22日
在GitLab 123计划弃用GitLab Runner中的Windows批处理命令行作业(例如cmdexe),以支持对Windows PowerShell的扩展和扩展支持。对于可能仍希望针对cmdexe运行项目的用户,可以从PowerShell调用这些命令,但不会为Windows批处理提供直接支持。
弃用日期:2019年9月22日
使用GitLab Runner 1110,当使用Docker和Docker Machine执行程序已更改了共享卷中缓存作业目录部分。 GitLab Runner现在缓存使用builds_dir配置的整个基本目录,而不是仅缓存作业工作目录的父目录。因为它是一个行为改变,我们添加了一个功能标志,允许控制是否应该使用新的或旧的行为。在GitLab Runner 123,将删除功能标志和旧有行为。
迁移日期:2019年9月22日
Python 27在2020年1月1日达到其生命周期,因此将在未来的GitLab版本中删除对Python 2的支持。
迁移日期:2019年12月22日
如果使用Omnibus安装自建实例,通过发行版办的包管理器直接升级即可:
比如CentOS下可以直接通过yum updata gitlab-ce自动完成升级过程。
GitLab 120将Enterprise Edition多年来进行的数据库更改合并到Community Edition中。作为这项工作的一部分,还删除了各种旧迁移。升级到GitLab 12的用户必须先升级到最新的 1111 补丁版本,然后再升级到 1200 。升级到1210等未来版本时,用户必须先升级到1200。如果不按照此顺序升级可能会导致数据迁移未成功,从而导致应用程序错误。 Omnibus安装会先强制升级到1200。 通过源码安装用户必须按照这个顺序受手动处理 (XX-> 1111->120 ->YY)。
GitLab 120默认使用Hashed Storage。这会影响新安装。
GitLab 120将自动将PostgreSQL版本升级到100。
用户可以跳过PostreSQL 100的自动升级,创建/etc/gitlab/ disable-postgresql-upgrade。
如果使用GitLab Geo,将在主节点和所有辅助节点上跳过自动PostgreSQL升级。我们将在121中为Geo用户提供升级路径。
默认情况下,GitLab 120将启用JSON日志记录。并提供了保留以前非JSON的日志格式的设置文档。
对于一个较大的Git工程,你可能会想在多个仓库之间共享代码,不管这些代码是在多个不同产品间使用的项目共享库或是一些模板。Git通过子模块来实现这样的需求。子模块允许将其他代码仓库的克隆作为子目录放到一个父仓库(有时候也称为父项目)中。一个子模块也是一个独立的仓库,你可以像其他仓库一样执行commit,branch,rebase等等 *** 作。
JGit提供了实现大部分Git子模块命令的API。我将在这儿给大家介绍这些API。
设置
本文中用到的代码片段将作为学习测试程序。简单的测试程序有助于理解第三方库是如何工作,以及如何使用新的API。你可以将这些测试程序看做是可控制的试验,帮助你更加直观地发现第三方代码是如何执行的。
除此之外,如果你保持编写测试程序,可以帮助你检验第三方代码的新版本。如果你的测试程序涵盖了如何调用这些库,那么第三方代码中不兼容的修改将会尽早展现出来。
回到之前的话题,所有的测试程序共享同一个设置,详细信息请查看源代码。现在有一个空的仓库,叫parent,以及另一个仓库叫library。测试程序中,library将会作为子模块添加到parent仓库中。library仓库初始化提交了一个readmetxt文件。测试程序中有一个setUp方法,用来创建这两个仓库,如下所示:
1
Git git = Gitinit()setDirectory( "/tmp/path/to/repo" )call();
这两个仓库用类型为Git的parent和library变量表示。该类封装了一个仓库并允许访问JGit的所有可用指令。就如较早之前我在这里中提到,每个Commnad类对应于一条原生的Git pocelain指令。调用一个指令需要用到生成器模式。举个例子,执行Gitcommit()的结果实际上相当于一个CommitCommand。你可以提供一些必要的参数去调用它的call()方法,从而执行相应的指令。
添加一个子模块
第一步当然是在一个已有的仓库添加子模块。通过上面提到的setUp步骤,library仓库应当作为子模块添加到parent仓库的modules/library目录下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
public void testAddSubmodule() throws Exception {
String uri
= librarygetRepository()getDirectory()getCanonicalPath();
SubmoduleAddCommand addCommand = parentsubmoduleAdd();
addCommandsetURI( uri );
addCommandsetPath( "modules/library" );
Repository repository = addCommandcall();
repositoryclose();
File workDir = parentgetRepository()getWorkTree();
File readme = new File( workDir, "modules/library/readmetxt" );
File gitmodules = new File( workDir, "gitmodules" );
assertTrue( readmeisFile() );
assertTrue( gitmodulesisFile() );
}
SubmoduleAddCommand对象需要知道两件事,第一是子模块从哪里克隆而来,第二是它应该存放在哪里。URI属性表示仓库库的克隆地址,这个克隆地址将会传递给clone命令。path属性则指定了相对于parent仓库根工作目录的路径,子模块将被存放在这个路径。这个指令执行之后,parent仓库的工作目录将会变成这样:
library仓库存放在modules/library目录下,而且它的工作目录树被检出。call()方法返回一个Repository对象,你可以把它当做一个常规的仓库来使用。这也意味着,你必须在程序中明确显式地关闭返回的仓库,以避免文件句柄泄露。
从上图我们可以看到,SubmoduleAddCommand做了一件事,它在parent仓库的根工作目录下创建了一个git模块文件,并把它添加到索引中。
1
2
3
[submodule "modules/library"]
path = modules/library
url = git@examplecom:path/to/libgit
如果你打开过Git的配置文件,你会发现以上句法。这个文件列出了当前仓库的所有子模块。对于每个模块,文件中列出了它仓库URL地址以及本地路径。一旦commit并push了这个文件,克隆这个仓库的一方就知道哪里可以获取相应的子模块(稍后会详细讲解)。
列出子模块
当我们添加了一个子模块之后,我们可以会想知道,它是否对于父仓库来说是可知的。第一项测试中我们做了一个基础的检测,验证了某些文件和目录的存在。我们也可以使用一个API来列出一个仓库的子模块,如下所示:
1
2
3
4
5
6
7
8
9
10
11
@Test
public void testListSubmodules() throws Exception {
addLibrarySubmodule();
Map submodules
= parentsubmoduleStatus()call();
assertEquals( 1, submodulessize() );
SubmoduleStatus status = submodulesget( "modules/library" );
assertEquals( INITIALIZED, statusgetType() );
}
SubmoduleStatus命令返回了一个子模块的Map集合,其中键是子模块的路径,值是这个模块的状态值。通过以上代码我们能够验证子模块确实已经添加进去,而且它的状态是INITIALIZED的。这个命令还允许添加一个或多个路径来限制子模块状态。
说到状态,JGit的StatusCommand并非原生的Git指令。如果在执行指令时添加选项‐‐ignore-submodules=dirty,那么所有对子模块工作目录的修改都会被忽略。
更新子模块
子模块通常指向他们所在的仓库的一次特殊的提交。如果之后有人克隆了父仓库,他们也会获得与之完全相同的子模块状态,即便子模块的上游有新的提交。
为了修改子模块,你像一下代码一样明确地对其进行更新:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void testUpdateSubmodule() throws Exception {
addLibrarySubmodule();
ObjectId newHead = librarycommit()setMessage( "msg" )call();
File workDir = parentgetRepository()getWorkTree();
Git libModule = Gitopen( new File( workDir, "modules/library" ) );
libModulepull()call();
libModuleclose();
parentadd()addFilepattern( "modules/library" )call();
parentcommit()setMessage( "Update submodule" )call();
assertEquals( newHead, getSubmoduleHead( "modules/library" ) );
}
这个较长的代码片段中,首先第一件事就是提交一些东西到library仓库中(第四行),接着将子模块更新到最近的一次提交。
为了让这种更新持久化保存下来,子模块必须被提交(第10,11行)。这次提交在子模块的名下(例子中是modules/library)保存了此次更新的commit-id。最后,通常需要将修改push上去,使得他们对其他仓库可用。
在父仓库中更新对子模块的修改
将上游的提交拉取到父仓库中也会修改子模块的配置。然而子模块本身并不会自动得到更新。
SubmoduleUpdateCommand就是用来解决这个问题。使用这个命令并不需要指定其他参数,它会更新所有已注册的子模块。该命令会克隆缺失的子模块并检出其配置中指定的提交。就如其他子模块命令一样,这里也有一个addPath()方法,以保证只更新给定路径下的子模块。
克隆一个包含子模块的仓库
此时你可能已经掌握一个规律,所有对子模块的 *** 作都是手动的。克隆一个包含子模块配置的仓库并不会默认克隆它的子模块。但是,CloneCommand命令有一个cloneSubmodules的属性,如果设置为true,那么将会克隆所有配置的子模块。从内部看,在对父仓库进行克隆之后,SubmoduleInitCommand和SubmoduleUpdateCommand命令会被递归地执行,并且父仓库的工作目录会被检出。
移除一个子模块
如果要移除一个子模块,你会希望可以这样写:
1
gitsubmoduleRm()setPath( )call();
但是很不幸,不管是原生的Git或者JGit都没有提供内置的移除子模块的指令,希望将来会添加这样的指令,在这之前,我们必须手动去移除子模块。如果你滚动到removeSubmodule()方法你会发现这并不是一件复杂的事。
首先,各个子模块会从gitsubmodules和git/config配置文件中移除。其次,子模块的入口会从索引中被移除。最后,gitsubmodules文件以及索引的修改会被提交,并且子模块的内容会从工作目录中删除。
遍历子模块
原生的Git提供了git submodule foreach命令为每个子模块执行一个shell指令。JGit并没有直接支持这样的指令,而是提供了SubmoduleWalk。该类可以用来迭代仓库中子模块。以下示例程序实现了为所有子模块拉取上游的提交。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void testSubmoduleWalk() throws Exception {
addLibrarySubmodule();
int submoduleCount = 0;
Repository parentRepository = parentgetRepository();
SubmoduleWalk walk = SubmoduleWalkforIndex( parentRepository );
while( walknext() ) {
Repository submoduleRepository = walkgetRepository();
Gitwrap( submoduleRepository )fetch()call();
submoduleRepositoryclose();
submoduleCount++;
}
walkrelease();
assertEquals( 1, submoduleCount );
}
通过next()方法walk对象可以指向下一个子模块,如果没有更多的子模块,该方法会返回false。使用SubmoduleWalk时,通过调用release()方法可以释放子模块相关的资源。再次强调,如果你获得一个子模块的仓库实例可别忘了关闭它。
SubmoduleWalk也可以用来获取子模块的详细信息。通过它的大部分getter方法可以访问到当前子模块的属性,诸如path,head,remote URL等等。
同步远程URL
从上面我们知道子模块的配置保存在父仓库根工作目录下的gitsubmodules文件中。而至少,在git/config文件中,我们可以重写覆盖子模块的远程URL。对于每个子模块,它们本身都有一个配置文件。那么反过来,每个子模块可以有另一个远程URL。SubmoduleSyncCommand命令可以用来将所有远程URL重置为gitmodules中的配置。
综上所述,JGit对子模块的支持几乎与原生的Git一致。大部分Git指令都在JGit中实现了,或可以通过一些途径进行仿真。如果你发现一些 *** 作缺失或实现不了,可以去友好且帮得上忙的JGit社区去寻求帮助。
《127小时》
远足者阿伦·罗斯顿在犹他州的一次远足中,在一个偏僻的峡谷中被掉落的巨石压住胳膊而无法动d,孤独的被困在那里。接下来的五天里,罗斯顿在精神上经受着巨大的考验,同时也审视着自己的人生,更为重要的是,他需要利用手上的一切条件想尽办法脱离险境。
最终,他痛下决心,以惊人的勇气给自己的胳膊做了截肢手术,并攀爬到65英尺的谷底,同时忍痛步行8公里后,最后获得营救,成功生还。
《127小时》是由丹尼·鲍尔执导,詹姆斯·弗兰科等人主演的冒险片。该片上映于2010年11月5日。讲述艾朗·罗斯顿在峡谷探险时遇到意外,并且成功地拯救了自己,该片是以真实故事为题材。
超人的意志成为了《127小时》扣人心弦的动力,詹姆斯·弗兰科饰演的遇难登山者,在一个人的独角戏里出色的人物心灵刻画,将冷静、乐观、孤独的情绪把控细致入微,而在执导上虽然根据真实事件的改编,使**难以营造一个如同《活埋》般耐人寻味的结局,将纪实与艺术严丝合缝用“127小时”度量了生命的力量。
编译和push自己想要获取log的程序 四、ylog的存储路径::/storage/emulated/0/ylog (使 (我自己打的log也在这里),该文件下 kernel文件夹是用来查看电池曲线相关的log 2、 查看全部>>
以上就是关于如果发现git push到gerrit的文件不全怎么办全部的内容,包括:如果发现git push到gerrit的文件不全怎么办、如何用 JGit 管理 Git 子模块、GitLab 12.0发布,大力加强安全功能,包括可视审阅和依赖列表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)