作者:鱼鹰 Osprey

很多初学者都不会使用 git 管理工程,一来不熟悉这个工具,二来不知道使用 git 有什么好处,增加学习成本,当初鱼鹰在大学的时候就有了解过 git 这个分布式管理工具,但真正用它管理工程还是在工作一年之后才开始的。

那个时候不知道 git 到底有多香,所以也不会想要真正使用它,最多就是从 github 上下载一些开源项目学习而已。直到跳槽的那个公司使用 git 去管理 STM32 工程,然后到现在差不多使用了两年的时间,才知道到 git 到底有多香了。

所以即使工作上没有要求使用 git 管理工程,也建议大家自行使用 git 去管理自己的项目。因为如果只是自己使用的话,是不需要搭建 gitlab 之类的服务器,直接安装好客户端在本地管理即可,也不怕上传公司项目到 github、gitee 服务器上而导致项目泄密的问题。

所以,强烈建议大家使用 git ,除了今天这篇笔记,鱼鹰接下来还会介绍一些非常常用的命令来帮助大家快速入手 git。

闲话少说,我们先看看 git 的几个优点,让各位道友产生些许兴趣。

1、可以查看每一次提交历史。

这些提交记录其实是你自己写的,每一次修改后,为了记录这次修改,自己写一点类似注释的东西,告诉 git 这次做了什么修改,方便后面出现问题追溯。

2、可以对比修改 

可以对比每次修改的地方,这样你可以知道为什么当前代码出现了问题,而以前代码没有问题。

3、可以对比当前修改 

当你修改了当前的代码时,可以告诉你目前做了哪些修改,这样你可以确定是否需要将这些修改保存提交。

4、无缝衔接 VSCODE 

可以使用 VSCode 轻松对比查看修改。

如何使用 git 管理 MDK 工程?_后缀

这些优点干巴巴的这样写还是比较枯燥的,所以鱼鹰会再下一篇笔记中结合命令和实际项目情况详细介绍。这次就不多说了。

直接进入本篇笔记的主题:如何使用 git 管理 MDK 工程?

MDK 工程有两个很关键的文件,即后缀 .uvoptx 、.uvprojx。所以你的仓库中必定需要使用 add 命令添加这两个文件。

如何使用 git 管理 MDK 工程?_git_02

其次就是你的 *.h *.c 文件,这些也必须添加(这不是废话吗,不然仓库放啥)。当然如果这些源文件使用了文件夹包含,也会把这些文件夹添加进去的(新建的文件夹只会在 git status 时显示文件夹,不显示文件夹内的具体文件,而如果是空文件夹,文件夹也不会显示,所以你无法添加一个空文件夹。文件夹添加只是顺带的)。

工程里面的其他文件都是不需要的,都是可以由这些文件自动生成,可以不被 git 所追踪(管理)。这样你上传到服务器的空间将大大减小。

比如,Objects 里面的文件,这些都是编译时自动生成的,不必占用空间。

如何使用 git 管理 MDK 工程?_git_03

还有 listings 里面的文件也不需要。

如何使用 git 管理 MDK 工程?_自动生成_04

当然,如果说你的分散加载文件 *.sct (Objects 文件夹下)比较特殊,不想使用上面工程文件生成的,那么你也要添加进仓库里面管理,这样别人下载你的工程后才能根据这个文件正确编译(比如自检代码时就要特制 sct 文件)。

使用 jlink 下载时,会生成两个文件:

如何使用 git 管理 MDK 工程?_后缀_05

这两个文件没啥用,就不用添加了,也可以自己生成。如果你有批处理文件,比如删除中间文件的批处理,那么也可以添加进仓库。

如何使用 git 管理 MDK 工程?_git_06

如果你使用了 MDK 的 *.ini 文件,那么这个也需要。这个可不是自动生成的。比如 RAM 运行时用的配置文件。

如何使用 git 管理 MDK 工程?_自动生成_07

你的工程可能使用 readme.txt ,那么这个也需要添加。总之一个原则是,只保留必须的,可以自动生成的非特殊文件都可以不添加进仓库占用空间。

那么如何保证 git 忽略那些不需要的文件呢?

其实你只要 add 你需要的文件就可以了,但这样一来,git 会一直提示你有哪些文件并没有添加到仓库中,问你是否需要添加进去,这样就很烦,所以就有一个 .gitignore 文件用来忽略这些不希望跟踪的文件。

如何使用 git 管理 MDK 工程?_后缀_08

特别注意的是,这个文件很特殊,它的后缀就是 .gitignore ,不是你认为的 txt 之类的后缀,而且没有文件名。所以如果说你新建了这个文件,又添加了忽略文件,但是 git status 还是显示了这些文件,那么就要好好检查你这个文件名是否正确了(只要有这个文件,立即生效)。当然你也要把它 add 进仓库,不然别人下载后就没有这个文件了,也就无法忽略那些文件。

那么这个文件可以添加什么内容呢?如下:

##########################################
#git add .
#git commit -m 'update .gitignore'
##########################################


!debug.ini  # 该文件不忽略
*.ini
JLinkLog.txt
Listings
DebugConfig
Objects
.vscode
*.uvguix.*
*.si4project
SI
*.TMP
*.hex
*.map
*.lnp
*.htm
*.sct
ExtDll.iex


这里加一个 代表这个 debug.ini 文件不忽略,而后面的 .ini 表示所有这类后缀文件都会被忽略。也就是说,.ini 文件里面只有 debug.ini 不能忽略,其它都忽略,比如前面的 RAM.ini。

Objects 代表这个文件夹内所有文件都忽略。

后面都是类似的。

还有要注意的是,如果你忽略的文件前没有加路径,那么它将忽略本目录和子目录下所有的同后缀名文件。而一旦加了路径,比如 USER/*.txt(注意必须是斜杆),那么只会忽略这个目录 USER 下的同后缀文件(不忽略子文件夹下的)。

以上就是鱼鹰想分享的 MDK 管理内容,建议大家尝试 git 管理项目,别再用复制文件夹这种效率低下的方式管理了。而当你需要维护多个定制化的客户项目时(大部分功能相同,只有少部分有差异的项目),你就会发现 git 是真的香。