缘由
近期就职了一家新公司,上级分配给我的第一个任务就是对已有的项目系统提出一些优化方案。新公司目前使用的是SVN做版本管理,因为有Git的使用经验,因此上手很快,但在使用的过程中,相比于Git,我遇到了几个不便利的问题:
- 主流IDE如 VS,VS Code都默认支持Git,有专门的Git窗口,可以查看变动的文件及数量,Git更新提交等操作, 但SVN还需要下载一个插件,使用体验不及原生支持。
- 在我做了一些测试性更改之后,准备先提交,然后继续修改,但点了下提交之后发现已经推到服务器了,这时我想到了SVN和Git的一个核心区别就是Git是分布式的,本地就是完完整整的仓库,可以在本地多次提交,而不更改服务器上的仓库。而SVN是集中式,本地并不是一个完整的仓库。我的个人的习惯是每实现一个小功能,便提交一次,最终在推送到远程仓库之前,再次整理下代码,将相似的提交合并等,最终推送到服务器。没有本地提交这个功能,多少觉得有点不便。
- 在我做了代码构建之后,发现很多bin、obj下的文件如dll,缓存文件等 也出现在了提交列表里,虽然不会默认提交,但也会影响提交的体验,如果新加了文件,就需要在这一堆文件里找到新文件进行勾选,然后才会被提交到服务器。 咨询了同事后告知可以在SVN的全局设置要忽略的文件、文件夹等。项目级别可以配置,但比较麻烦,每个文件夹都需要配置下对bin、obj等文件夹或者具体文件的忽略,如果选择循环配置那么会改动很多很多的文件夹,即使某个文件夹并不需要配置。而这在Git是非常方便的,一个.gitignore文件就搞定了,大部分的语言项目都配备有默认的 .gitignore模板,即使切换机器,新人报道,也不需要重新配置。
当然还有一些小问题:如何在本地有大量改动的情况下切换去修改紧急的bug,如何做代码评审等, 基于这些小问题,我把使用Git来做版本管理作为了一个优化项,后续的交流过程,领导也表示了理解,对代码评审等功能也比较期待,希望做出此项改动,但是有要求代码不出外网,因此不能使用 Github,Gitee等云托管网站,对企业也有免费的支持。因此只能寻找开源解决方案,在内网搭建一套Git源码托管服务,起初我觉得这是一个很艰巨的任务,但实际操作下来,发现极其简单。
使用 Gitea 来搭建Git托管服务
寻找解决方案时第一眼就找到了Gitea,Gitea是一个开源的轻量级代码托管解决方案,后端采用Go编写,采用MIT许可证,目前在Github上已有32k+的star,文档齐全,对中文的支持也很好,除CICD功能外,基本和Github/Gitee等功能相同,安装也很方便,支持二进制,docker等。
安装
- 这里选择的是二进制安装,从官方下载页面下载二进制程序 https://dl.gitea.io/gitea/1.17.2 我这里选择的是 gitea-1.17.2-gogit-windows-4.0-386.exe
- 双击打开之后,本以为是安装程序,实际确实一个Web服务,这个Git托管服务已经跑起来了,提示已经监听了本地的3000端口。
配置
- 本地打开 localhost:3000 之后默认需要配置些基本信息,如 站点名称、根目录、日志目录等,数据库支持 MySQL、PostgreSQL、MSSQL、SQLite3, 若使用mysql,需要输入用户名密码。如果没有MySql,建议直接选择SQLLite3,然后什么都不用修改。
- 点击最下面的立即安装,1分钟后即可使用,默认会转到登录页。
- 在防火墙里开放下 3000端口,就可以在局域网内访问了。
- 使用命令设置为 windows服务,如果服务器重启,服务会自动启动。
sc.exe create gitea start= auto binPath= "\"C:\gitea\gitea.exe\" web --config \"C:\gitea\custom\conf\app.ini\""
使用
创建用户并登录后,便和Github 的使用方法完全一致,仓库也分私有仓库和公开仓库,也可以创建 组织、团队等。点击探索可以查看该站点下的所有公开仓库,个人首页长这样。
仓库详情页:也支持watch、star、fork等,提Issue,Pull Request,也还支持上传各种包,如npm,nuget,docker image等,公司内部的包管理都可以放到这里,然后项目里就可以共享了。
迁移SVN仓库
使用 Git 命令行可以很方便的把SVN仓库迁移到Git仓库
git.exe svn clone <svn_repo_url> <folder> -T trunk -b branches -t tags
总结
整个过程还是比较顺利的,Gitea使用起来体验也很好,缺少的CICD功能可以使用Webhook + Jenkins来作为补充,更加方便和灵活。