1 前言
使用Git后的感受只有一个成语能形容:相见恨晚
一旦熟练使用Git后,就再也离不开它了。
我既有独自开发的项目,也有和同事一起开发的项目,Git都能轻而易举地管理它们。
本文是我学习Git的过程记录,供需要者参考。
2 初识命令行Git
参考廖雪峰的Git教程。
包括Git的安装、基础的Git命令。
这一时期大概持续一周,期间不停地做笔记、做实验。
3 在uVision环境中使用Git管理工程
参考《 Using Git for Project Management with uVision》。
这篇文档是Keil官方提供的。介绍如何在uVision环境中使用Git:先配置SVCS,然后在keil uVision中以图形界面调用Git命令。
配置uVision的SVCS
在使用Git之前,需要先配置uVision的软件版本控制选项单。uVision版本V5.15以及以后版本提供了一个用于Git的SVCS模板文件。该文件名为GIT.SVCS,可以在安装目录下找到(比如C:\Keil_v5\UV4)。如果是V5.15之前的版本,可以从Keil官网或互联网上下载此文件,然后拷贝到Keil的安装目录下。
点击uVision菜单 SVCS - Configure software Version Control…
加载模板文件:
加载完毕后,点击OK键。现在,uVision已经准备好使用Git进行版本控制了。
访问uVision工程文件
使用SVCS菜单时,通常可以访问uVision的项目窗口中突出显示的文件。比如,如果你在工程窗口中选中了iap.c文件,然后使用SVCS菜单,会发现SVCS菜单选项针对的是iap.c文件:
要访问uVision工程相关文件,也和访问普通文件类似,先点击Project窗口的特定区域,其中:
WorkSPace 对应 uvmpw文件
Project 对应 uvprojx文件
Target I 对应 uvoptx文件
我自己完整地翻译了这个文件,按照文件的每一个步骤做了测试。
这一过程用了一周左右。
然后发现该文档提供的方法十分难用:使用不灵活,功能也缺失。我后面并没有使用这种方法管理工程。
但该文档提供了很多在uVision环境下使用Git的注意事项,这些很有用:
需要版本控制的工程文件
在设置工作流之前,项目经理要绝对清楚哪些文件需要版本控制。除了所有源代码需要版本控制外,uVision的一些特殊文件也要进行监控。
所有用户源文件(.c、.cpp、.h、.inc、.s、.txt)
工程文件:Project.uvprojx(用于构建项目)
工程选项文件:Project.uvoptx(保存调试器和跟踪配置信息)
用于多个工程工作区的工程文件:Project.uvmpw
复制到工程中的运行时环境配置文件(.\RTE文件夹下的所有文件)
RTE:MDK5.0之后运行时环境,主要有外设驱动、操作系统、库和协议栈。
由软件组件创建的#include列表:RTE\RTE_Components.h文件
设备配置文件,比如:RTE\Device\LPC1857\RTE_Device.h
连接控制文件(Project.sct,如果手动创建的话)
所有相关Pack文件(比如ARM::CMSIS)
不需要监控的文件
工程页面布局文件:Project.uvguix.username
在.\Listings和.\Objects文件夹中产生的输出文件
用于调试适配器的INI文件
忽略不需要监控的文件
在上面列举出了不需要监控的文件,这里介绍如何忽略这些文件。
在工作区根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
文件 .gitignore 的格式规范如下:
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只匹配一个任意字符;如果在方括号中使用短划线(-)分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号()表示匹配任意中间目录,比如 a//z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
在Git命令行中输入:
touch .gitignore
在工作区根目录下生成.gitignore文件,使用 notepad++ 打开该文件,输入要忽略的文件或目录,支持*通配符。我自己的.gitignore文件,供参考:
#Keil Generated output files in the sub-directories .\Listings and .\Objects
*.lst
*.o
*.d
*.crf
*.lnp
*.axf
*.htm
*.build_log.htm
*.dep
*.iex
*.i
*.bin
*.hex
#Keil Project screen layout file
*.uvguix.*
*.uvgui.*
#JLINK file
JLinkLog.txt
注意:
千万不要使用Windows自带的记事本编辑任何文本文件。Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费! —摘自廖雪峰的Git教程
设置Git
禁止行尾自动转换
.uvprojx和.uvoptx项目文件的每行以换行符(LF)结尾(UNIX风格),而在Windows系统中,文件的每行通常使用回车换行符(CRLF)结尾。Git会自动检测这一点,并将服务器上的行尾改为CRLF。这样会出现不一致,可以使用以下命令禁止Git自动修改行尾。
在Git命令行界面中输入:
git config --global core.autocrlf false
设置用户信息
安装完Git之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改。
在git命令行界面中输入:
//设置提交代码时的用户信息
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"
其中, user为你的用户名,email为你的邮箱,配置这两个信息以确保你的唯一性。
使用--global参数表明你这台机器上所有的仓库都进行相同的配置。如果使用了--global选项,那么该命令只需要运行一次。
当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有--global选项的命令来配置。
设置文本编辑器
当 Git 需要你输入信息时会调用文本编辑器。 如果未配置,Git 会使用操作系统默认的文本编辑器。可以使用git config --list来查看GIt默认的文本编辑器是什么(core.editor=“编辑器路径\编辑器名字.exe”)。这里推荐使用Notepad++,在Git命令行界面中,使用下列命令设置:
$ git config --global core.editor "'C:/ProgramFiles/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
其中,Notepad++的安装路径以自己的电脑为准。
4 远程仓库
文档《 Using Git for Project Management with uVision》中用到了Github。这是一个代码托管平台,也可以作为远程仓库用。
我申请了GitHub账号做测试,在测试期间,发现访问这个网站非常非常慢,即便它再快上10倍,也不符合我的预期。所以我找到了Gitee。
以下内容以Gitee为例。
注册Gitee
在官网注册。
创建SSH秘钥(key)
在git命令行界面中输入:
ssh-keygen -t rsa -C "email"
此时,C:\Users\Administrator.ssh目录下会生成两个文件:id_rsa和id_rsa.pub,把id_rsa.pub文件中的内容复制下来。
在Git命令行工具中输入命令cat ~/.ssh/id_rsa.pub也可查看id_rsa.pub的内容。
设置远程仓库SSH秘钥
打开你的Gitee主页,点击账户设置-安全设置-SSH公钥,把刚才复制的ssh 秘钥粘贴到公钥输入框中。
添加远程仓库
在Gitee新建名为bootloader的空白仓库(不使用Gitee提供的任何模板文件,否则推送的时候会因为服务器中有本地没有的文件而报错,为处理这个错误要多出许多步骤来),复制远程仓库地址,在Git命令行中关联远程仓库:
//git remote add origin https://gitee.com/用户名/仓库名.git
git remote add [shortname] [url]
这里[shortname]是远程仓库的简写,一般都使用origin。
将本地仓库推送到远程仓库
//将本地分支推送到远程主机,
//git push -u origin master 第一次推送使用-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
//git push origin master 非第一次提交
git push [remote] [branch]
其中[remote]为远程仓库的名字,在添加远程仓库小节中,已经将远程仓库命名为origin;[branch]为本地仓库名字,默认为master。
如果在push的过程中出现错误:errot:Updates were rejected because the remote contains work that you donot have locally.(拒绝更新,因为远程仓库包含本地没有的文件),这个时候需要使用pull命令:
git pull [remote] [branch]
//如果出现fatal: refusing to merge unrelated histories(拒绝合并不相关历史),可以使用git pull origin master --allow-unrelated-histories来强制合并不相关历史提交
从远程仓库克隆
要获取现有Git仓库的副本(例如组内其他成员创建的项目)需要使用git clone命令。它不仅获得工作副本,服务器上几乎所有数据的完整副本也保存到硬盘中。如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写,换句话说,不必再使用git remote add [shortname] [url]命令添加远程仓库。
现在Gitee中已经有一个远程仓库bootloader,现在将这个远程仓库克隆到本地。
首先新建文件夹“bootloader_clone”,右击鼠标,在弹出的菜单中选择“Git Bash Here”,弹出Git命令行工具。输入:
git clone git@gitee.com:用户名/仓库名.git
克隆仓库命令是:git clone <url>
其中,<url>为远程仓库的地址,以Gitee为例,介绍获取远程仓库地址方法:
在图中可以看到给出的地址不止一个,Gitee还给出了https、SVN、SVN+SSH等地址。实际上,Git支持多种协议,默认的git://使用SSH,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
额外补充:
要克隆 Git 的链接库 libgit2,可以用下面的命令:
git clone https://github.com/libgit2/libgit2
这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git 文件夹, 从远程仓库拉取下所有数据放入 .git 文件夹,然后从中读取最新版本的文件的拷贝。 如果你进入到这个新建的 libgit2 文件夹,你会发现所有的项目文件已经在里面了,准备就绪等待后续的开发和使用。
如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以通过额外的参数指定新的目录名:
git clone https://github.com/libgit2/libgit2 mylibgit
这会执行与上一条命令相同的操作,但目标目录名变为了 mylibgit。
克隆命令正确执行后,Git工具输出克隆结果:
而且在文件夹“bootloader_clone”中可以看到完整的工程目录。
这一阶段半天即可完成。
5 命令行Git进阶
到此已经可以用Git简单的管理工程,如果要系统的学习Git,还远远不够,我找到了一本权威书籍《Pro Git》。可以在线查看或者下载PDF版本。
我自己看了前7章,并在之后的应用中不断查找我需要的内容。
这一阶段持续半月有余。
6 Git图形界面
在阅读《Pro Git》的过程中,我开始使用Git图形界面,选择的是TortoiseGit。
参考《TortoiseGit Manual - Chapter 2. TortoiseGit Daily Use Guide》。
边使用TortoiseGit边与Git命令行相对照,遇到不懂的查《Pro Git》或者搜索相关网页。
这一阶段持续半月有余。
7 小结
目前使用TortoiseGit管理工程,用Gitee作为远程仓库。
命令行Git已经不再使用。
作者:zhzht19861011
原文链接:https://freertos.blog.csdn.net/article/details/109983129