Git使用经验点滴

在开源软件大流行的今天,git成为使用最广泛的源代码管理工具。对于git的用法,我只是个小白。但因为一定要用,而且也时常遇到问题,所以在实践中逐渐积累了几点经验。不忌浅陋,分享给各位格友。

金秋丰收季高清素材 丰收 大丰收 稻谷 粮食 金秋丰收季 麦子 元素 免抠png 设计图片 免费下载 页面网页 平面电商 创意素材

A. 克隆Linux内核代码

Linux内核可谓是全宇宙里最活跃的开源项目,数以万计的人工作这个项目上,几乎每天都有提交。对于这样的代码仓,如果使用简单的git clone命令来复制,需要下载上千万个对象(object),如果网络不好,可能要用几个小时。更糟糕的情况是,中间可能因为超时而中断,需要重头再来。

以下载幽兰的内核代码为例,如果使用简单的git clone命令,那么要下载的对象有10152370个。

昨日,小伙伴修改自动构建脚本时,不小心把本地的代码仓删除掉了,尝试使用extundelete,没有成功。

下班之后,我先是在办公室里使用上面的命令操作,用了大约1个小时,只完成了15%。当我犹豫是否等待它结束时,git显示超时错误而退出了。

吃过晚饭,我又尝试使用云上的虚拟机来下载,网速很快,5分钟左右就完成了大约30%,但是到了大约36%时,下载速度变成了0KB/S,git非常缓慢地更新接收的对象数,估计是在处理复杂的数据对象。git的对象有以下几种(来自AI):

- Blob 对象(Binary Large Object):存储文件的内容,不包含文件名和路径信息。

- Tree 对象:存储文件和目录的结构,包括文件名、路径以及它们对应的 blob 对象和子 tree 对象的引用。Tree 对象用于表示项目中的一个特定时间点的目录结构。

- Commit 对象:存储提交的信息,包括提交的作者、提交者、提交时间、提交消息以及一个或多个 tree 对象的引用。Commit 对象用于表示项目历史中的一个提交点,它指向一个 tree 对象,该对象描述了该提交时的项目结构。

= Tag 对象:用于为特定的 commit 对象打标签,通常用于标记发布版本。Tag 对象可以是轻量级的(只包含标签名和指向的 commit 对象的引用),也可以是带有标签名、标签者信息、标签时间和标签消息的附注标签。

虚拟里的CPU和内存都很少,估计是在处理复杂的对象引用关系时,算力不够用了。

我等待了一会就不理它了。

今天早上再看,克隆操作没有成功,本地没有代码。犹豫之际,想到前些天曾经看到过--depth=1选项,加了这个选项后,仍会下载完整的最新代码,但只会保留最近一次 commit 记录。

尝试增加这个选项再试,立竿见影,要下载的对象数从1千多万减少到8万多,不到5分钟就全搞定了。

gdman@GewuVM:~$ git clone --depth=1 https://github.com/gedulab/linux-yourland.gitCloning into 'linux-yourland'...remote: Enumerating objects: 88592, done.remote: Counting objects: 100% (88592/88592), done.remote: Compressing objects: 100% (83945/83945), done.remote: Total 88592 (delta 8740), reused 21251 (delta 3763), pack-reused 0 (from 0)Receiving objects: 100% (88592/88592), 245.57 MiB | 8.60 MiB/s, done.Resolving deltas: 100% (8740/8740), done.Updating files: 100% (83703/83703), done.

下载到虚拟机里后,再一条tar命令压缩打包成一个文件:

tar -czf linux-yourland.tar.gz linux-yourland/

压缩后的文件不到500MB,504800191字节。

-rw-rw-r--  1 gdman gdman 504800191 May 20 22:51 linux-yourland.tar.gz

然后下载到本地就可以了。

B. 最快捷下载代码

对于某些开源项目,如果我们只想简单了解,不需要提交代码,那么就不必使用git clone这样的命令来克隆仓库,最快捷的方式就是下载代码的压缩包,在浏览器上操作一下就可以了。

以上面的幽兰内核代码仓库为例,下载代码包在上海办公室里的Windows机器就可以轻松完成,下载的zip包只有200多MB,比上面使用--depth=1选项的压缩包还小很多,不到后者的一半大小。

C. 克隆UEFI固件代码

用一句时髦的话来说,Linux内核仓库是绝对的“完全自主可控”,从git仓库的角度来看,内核仓库不依赖任何其它任何仓库。而UEFI项目则不同,它依赖很多其它代码仓,有些依赖的代码仓又有依赖。

对于UEFI这样的代码仓库,如果要克隆到本地,那么一定需要加上--recursive选项,告诉git递归下载依赖的代码仓。否则下载的代码就是不完整的,无法编译。

我在UEFI课程(《筚路蓝缕,UEFI以战说法》)的第一讲,有过详细介绍。

D. 使用VsCode提交代码

因为大家都知道的原因,访问github不容易,下载代码不容易,提交代码也不容易。提交代码的数据量一般不大,主要问题在认证上。

GitHub提供了很多种认证方式,SSH,PGP等,但是最简单的密码方式老早就被禁止掉了。SSH和PGP多少有点麻烦的。我比较喜欢验证码的方式,在手机上安装一个产生验证码的Authing Token App。

验证码的优点是简单灵活,不用与机器绑定。但也有局限性,就是在没有图形界面的Linux命令行情况,无法工作(哪位有方法?)。

为了绕过这个局限,可以使用VsCode打开Linux上的代码,然后使用VsCode在Windows系统上提交代码,这样就可以使用验证码方式进行认证了。刚刚使用这种方式又做了一次提交。

E. 在浏览器里同步新的分支

还是以幽兰的代码仓(linux-yourland)为例,它是从ArmBian的linux-rockchip仓库(https://github.com/armbian/linux-rockchip)fork出来的。

fork出来后,armbian的仓库建了很多新的分支。对于如何把新的分支同步到已经fork出来的仓库,有多种做法,但一般都是需要在命令行知操作,执行git fetch upstream,git checkout等步骤。

其实有个简单的方法,就是在分支管理里(https://github.com/gedulab/linux-yourland/branches)创建一个新的分支,名字要与想同步的上游分支一致。比如,幽兰希望使用上游的rk-6.1-rkr5.1分支,那么便建一个同名的分支。

创建好分支之后,就可以在浏览器里通过同步按钮同步代码了。试过几次这种做法,都工作得挺好,没有发现什么不足。

以上是一些点滴的经验,对于git高手来说,不值得一提,写出来只为分享给初学git的格友,如果大家有什么好的经验,也欢迎留言。

本文作者主讲的《纳秒级优化训练营》北京站正在招生中,对低延迟设计感兴趣,或者极致追求性能的同行欢迎垂询。

(写文章很辛苦,恳请各位读者点击“在看”,欢迎转发)

*************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物

Image

也欢迎关注格友公众号

Image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值