Git 的优点之一就是分布式,因此我们可以很方便的把 Git 仓库从一个服务器迁移到另一个服务器。我们需要做的只是在本地仓库添加新服务器地址,然后向新服务器push。
也是因此,我在很多年前就把个人笔记放到 Git 上。这样的好处是数据在自己手里,即便 Git 托管服务提供商倒闭了,我只需要花费1分钟就能把仓库切换到另一家服务商那里了。
盘点一下这些年用过的 Git 托管商
GitHub 就不提了,大家都知道。先说一个大家可能没听过的,叫 GitCafe,国内公司的,网站的 logo 是一杯咖啡,于 2012 年上线,那时候做 Git 托管这个赛道的厂家很少,在国内 GitCafe 比 GitHub 的访问速度快,当时也是风头无两。直到 2016 年的时候 GitCafe 被后来者 Coding(后面也会提到)收购,被收购后就停了个人业务,后面慢慢的就消失了。
GitEE,大家估计都听过这个,因为现在别家基本上都倒闭了,剩 GitEE 还活着。但是 GitEE 早期的使用体验非常不好,如果项目里有稍微大一点的文件,用户需要手动执行下面的命令来修改 HTTP post 缓冲区的大小:
1
git config --global http.postBuffer 524288000
用别人家的服务(GitLab除外)是不需要这样设置的,也是这个原因让我对 GitEE 的印象很不好,被恶心到几次后就是尽量避免用这个产品了,当然现在的 GitEE 已经没这个问题了。
Coding,终于讲到 Coding了!2014 年上线的,当时给人的感觉就是眼前一亮,界面很摩登,使用体验也很棒,也不限制免费用户可以创建的仓库数。当时 GitHub 免费用户是不能创建私有仓库的,所以我从那时起,需要用 Git 托管的地方就直接首选 Coding 了。
Coding 上面的活动也很多,一开始还搞了一个“冒泡”社区,类似于微博,只不过用户都是程序员。别人点赞了你的冒泡会有积分,积分可以兑换 Coding 的周边,对了 Coding 的 logo 是洋葱猴,其中有个周边就是洋葱猴抱枕。
另一个大事就是 Coding 收购 GitCafe,当时 Coding 的风头不比现在的 GitEE 差。可能是像我这样白嫖的人太多,付费用户太少,后来慢慢的“冒泡”社区关闭了,Coding 也慢慢冷清了。
再后来 Coding 被腾讯收购了,我心想腾讯多有钱,这样我能一直用下去了。直到今年看到 Coding 下线的公告。
有点遗憾,不过还是非常感谢 Coding 让免费用户白嫖了这么久,竟然已经有十一年了。
虽然说腾讯云还提供了云原生构建代替 Coding,但我暂时先不尝试了,决定试一下把仓库放到自己的地盘。
Git 支持的协议
Git 支持四种协议:本地协议、HTTP 协议、SSH 协议和 Git 协议。在这四个协议中比较常用的是 HTTP 协议和 SSH 协议,我们常用的第三方托管平台如 GitHub、GitEE 等都会为每个 Git 仓库提供一个 HTTP 地址和一个 SSH 地址。
本地协议不常用的原因是如果我们的远程仓库和本地仓库都在同一个硬盘上,当这块硬盘发生故障时两个仓库就会同时阵亡,无法起到备份的作用。
本地协议也可以用于本地文件系统挂载的
网络共享文件夹,但如果要在不同的电脑上同步代码时,需要每台电脑都能访问并挂载网络共享文件夹,这就不太方便了。
还有一个 Git 协议,Git 协议使用与 SSH 相同的数据传输机制,但是省去了加密和授权的开销,所以传输速度最快。但因没有用户授权机制,也不太适合私人项目使用。
HTTP 虽然自带用户授权机制,但是需要搭建 Web 服务器,需要配置 git 后台 CGI 程序,且无法像 SSH 协议可以做到免密登录,因此也不是最优解。
SSH 还有一个优势是服务器版的 Linux 基本都预装了 SSH Server 服务(用于用户远程登录管理服务器),你不需要额外的安装任何软件服务!
Git 使用 SSH 协议示例
我们现在假设家里有一台支持 SSH 登录的服务器(此服务器绑定了域名example.com)(现在一些中高端的路由器已经支持 SSH 登录),远程用户的用户名为 bob,它上面连接着一块移动硬盘,硬盘的挂载目录是/mnt/data,我们在移动硬盘的根目录上创建了名为git的文件夹用于存放 Git 仓库。
在我们的本地电脑上有一个项目名为 Notebook。
在服务器上创建裸仓库
裸仓库可以理解为不包含项目工作区域文件的 Git 仓库,有两种方式可以创建裸仓库:
初始化一个裸仓库(用于新建的项目):
1
2
3
mkdir Notebook.git
cd Notebook.git
git init --bare
从已有仓库导出裸仓库(用于已有项目):
1
2
# 从D盘project/demo项目中导出裸仓库
git clone --bare d/projects/Notebook/.git Notebook.git
裸仓库是一个以XXX.git命名的文件夹,其内容基本与 Git 项目中的.git文件夹相同。
有了裸仓库后,就可以把裸仓库复制到服务器上了:
1
scp -r Notebook.git bob@example.com:/mnt/data/git
现在就可以使用bob@example.com:/mnt/data/git/Notebook.git地址作为 Git 远程仓库地址了。


