type
status
date
slug
summary
tags
category
password
icon
很多时候,我们并不会对所画的PCB进行版本上的管理,只是在对PCB验证完成后对工程文件打包压缩,并配上相应的技术文档和规范的压缩包命名方式,这很大一部分依赖于硬件工程师的素养。很多时候,面对着多个不同的PCB版本,并不能确定最终生产的版本是哪一个,通过引入Git来管理这些更加方便
在软件程序设计中,版本控制被广泛的应用与源代码的管理,在嵌入式开发中,也被广泛运用。在硬件PCB设计中,大多数对于改板的情况下,通常是在拷贝一份新的PCB板进行修改,并在文件夹名上进行好备注,这让我感到非常的不优雅,没有分支管理这种功能,对于版本回溯,也只能回来打开原来的文件夹,过多的文件夹对于管理版本也是很大的问题,需要做好每一版本的备注。
虽然大多数使用Git是应用在程序设计、多人协同开发等,但在硬件设计中使用Git也能极大的优化设计体验。虽然,大多数的原理图及PCB都是二进制的,对于Git这种原生为代码管理设计而生的,来查看PCB差异复杂。虽然如此,但Git针对二进制也有合适的管理方法如LFS。
使用Git之后,使用Git的版本库(Repository),也就不用保存压缩各个版本的设计文件了。依托分支管理,也可以修改将不同需求分布到不同分支上进行开发,大大简化了设计文件夹的复杂性。
Git?
有关Git知识,可以查看廖雪峰老师的Git教程,生动易懂。
创建版本库
版本库repository,又可以称作仓库。在版本库中,目录中所有的文件都可以被Git所管理。文件的修改,添加,删除都可以Git所管理起来。
CLI命令行方式在文件夹中,可以使用git init
初始化当前的文件夹为Git所管理的版本库。初始化后,Git会生成一个.git
的隐藏文件夹,该里面用于跟踪和管理版本。也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。⚠️注意:不要改动.git
文件夹。
相对于使用CLI命令行,在Windows端使用GUI工具无疑是一种不错的选择,使用
TortoiseGit
在空白处右击Git在这里创建版本库,直接确定便会初始化好版本库。Altium 官方使用外部Git版本控制
我们仅仅需要在外部创建一个Git版本库,远程和本地工作Git存储库的管理通常通过公司系统和外部Git工具进行,而文件级的操作(提交、推送、更新等)则在Altium Designer编辑环境中即可处理。
下面是Altium所提供关于使用外部Git版本控制的官方文档
创建工程
添加SCH、PCB、Lib等
在工程文件夹下新建PCB,SCH,LIB文件夹(个人习惯),将对应的文件保存到对应的文件夹中。
⚠️注意:在使用Altium官方管理Git时,所建立的pcb,sch等文件都必须保存到prjpcb所在的路径下。
添加到版本控制
右击相应的文件添加到版本控制(别忘了工程文件.Prjpcb),添加完成后文件右侧显示 ➕号
添加完成后通过可以在.git所在的文件夹下(也就是GitDemo)下查看版本日志。
可以查看到添加到版本库的文件在日志中已经显示
提交
绘制完成SCH的小功能并完成一次提交
让后先点击左下角选择Commit进行提交,先不进行推送。
编辑提交日志消息commit,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。commit应该有格式要求,具体请自行Google。
通过
TortoiseGit
查看日志消息,发现完成了一次提交。commit id 版本号
在PCB预布局完成后,再次提交一次,用来保存预布局的版本。每提交一个新版本,实际上Git就会把它们自动串成一条时间线。
通过每次提交来保存不同的版本库,不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。
Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为
commit
。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit
恢复,然后继续工作,而不是把几个月的工作成果全部丢失。查看日志实际本质上是调用了git命令
git log
,它展示了每次提交的日志如果嫌输出信息太多,看得眼花缭乱的,可以试试加上
--pretty=oneline
参数:在这些信息中,诸如
97212b…
这样的代表着commit id
(版本号),这是Git所生成的SHA-1。和SVN不一样,Git的commit id
不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id
和我的肯定不一样,以你自己的为准。为什么
commit id
需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:
首先,Git必须知道当前版本是哪个版本,在Git中,用
HEAD
表示当前版本,也就是最新的提交97212b...
(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
。回退
选择要回退到那一次提交,这里回退到预布局的那次提交
4d8da5……
。此时,main.pcbdoc被关闭后重新打开为预布局那次的提交。这样,我们就回退到相应的版本中去了。
diff查看器
虽然Git没办法跟踪PCB这种二进制文件的改动,但Altium Designe可以,让我们来试一试。
在回退后,我们可以在版本控制中选择
与HEAD比较
,就可以比较回退后的版本与当前的版本之间的差异,我们先回退到预布局的版本,然后与HEAD比较
。Altium Designe为当前版本
1d3a6f…
和4d8da5……
生成了两个窗口,同时弹出了Differences
窗口,显示两次提交的差异。也可以查看两个不同版本之间的差异,在存储管理器中,先用鼠标选中一个版本,再按住ctrl键,选另一个版本,右击可以比较两者之间的差异。
外部Git
使用Altium Designe自身来commit对于我来说有些鸡肋,我更喜欢在外部直接管理这些文件,而不是在Altium Designe进行提交推送的操作,只有在解决冲突、差异查看时使用Altium Designe才有它自己的作用。
在版本库下新建一个PCB工程,来使用Git来管理这个PCB
在PCB设计过程中,会产生一些编译文件,历史文件等。我们不需要对这些文件进行文件管理,因此,我们需要告诉Git哪些文件需要排除在外。我们需要编写
.gitignore
文件来忽略这些文件。在AD绘制PCB的工程中,我们最少要忽略
CLI命令行方式使用git add
将文件添加到暂存区。接着使用git commit
命令将暂存区的文件提交到版本库中,后面字符串参数记录着这次提交文件的信息,但在此之前,我们需要设置作者和邮箱。提交后可以使用git status
查看是否还有文件未提交。所有的文件都被提交了,接着我们修改.gitignore
文件后使用git status
命令告诉我们.gitignore
被修改。我们可以通过git diff
查看文件所修改的内容在查看修改内容后,可以方向的提交到仓库中去,接着执行git add
git commit
将文件提交到仓库中。在Git中,只能跟踪文本文件的变化,如txt,程序代码等,Git可以告诉这些文件之间的差异和改动。但对于二进制文件(如PCB,原理图,图片,音频等)而言,Git只能用来版本管理,而无法跟踪文件的变化,只能将改动串接起来,而无法了解其中的改动。
使用命令行对于我是一件痛苦的事情,我现在正在使用TortoiseGit来对我的项目进行管理,但在此之前,需要进行一些设置。
配置名称及Email
右键选择提交→”main”,我们可以清晰的看到修改、增加已经删除了哪些文件。
大多数的情况下,我们都是在开发完一个较为完整的功能后进行一个小提交,不要提交过于频繁,同时及时使用
ctrl+S
保存文件,在完成一个任务节点后提交文件到分支上。差异查看
我们只是用外部工具代替了使用Altium Designe管理文件,但对于差异查看,依然得使用Altium Designe的官方工具。如果你的PCB和SCH不在工程文件夹下,那么在Altium Designe也没有办法查看这些差异。