3、Git与代码管理:安装Git,配置SSH Key,从GitHub克隆ArduPilot源码
好,咱们进入第三章。这一章说白了,就是搞定你的「代码仓库钥匙」和「下载通道」。没有 Git,你后面所有的工作都无从谈起。我个人习惯把 Git 比作一个时光机——不仅能下载代码,还能随时回到任何一个历史版本。这在调试 ArduPilot 这种几十万行代码的项目时,简直是救命稻草。
3.1 安装 Git:你的第一把工具
不同操作系统安装方式不一样,我分别说一下。你根据自己电脑的系统选一种就行。
Windows 用户
去 Git 官网下载安装包,或者用 winget 命令(Windows 10 1709 以上版本自带):
winget install --id Git.Git -e --source winget
安装时注意几个选项:
- 默认编辑器:选 VSCode 或 Nano,别选 Vim(除非你熟悉 Vim 操作)
- PATH 环境变量:选「Git from the command line and also from 3rd-party software」
- 换行符转换:选「Checkout Windows-style, commit Unix-style line endings」——这个很重要,我在项目中遇到过因为换行符不一致导致编译报错的情况,折腾了半天才发现是 Git 自动转换搞的鬼
macOS 用户
最简单的方式是通过 Xcode Command Line Tools:
xcode-select --install
或者用 Homebrew:
brew install git
Linux 用户(Ubuntu/Debian)
sudo apt update
sudo apt install git
装完之后,验证一下:
git --version
看到版本号输出,就说明装好了。
3.2 配置 Git 身份:让代码认识你
Git 每次提交代码都会记录作者信息。你需要设置用户名和邮箱:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
这里有个小细节——邮箱最好用 GitHub 注册时用的那个,这样提交记录能关联到你的 GitHub 账号头像。我刚开始用 Git 时没注意这点,结果提交记录上显示的是一个默认头像,看着特别别扭。
查看配置是否生效:
git config --global --list
3.3 配置 SSH Key:安全连接 GitHub
为什么要用 SSH?说白了,就是不用每次操作都输密码。GitHub 支持两种协议:HTTPS 和 SSH。HTTPS 每次 push 都要输账号密码,SSH 通过密钥对实现免密登录。
生成 SSH Key 的步骤:
- 打开终端(Windows 用 Git Bash)
- 运行以下命令:
ssh-keygen -t ed25519 -C "你的邮箱@example.com"
这里我推荐用 ed25519 算法,比传统的 RSA 更安全,密钥也更短。如果你用的是比较老的系统,可以用:
ssh-keygen -t rsa -b 4096 -C "你的邮箱@example.com"
然后一路回车,默认保存路径是 ~/.ssh/id_ed25519。你可以设置一个密码短语(passphrase),也可以留空。我个人习惯设置一个简单的密码短语——多一层保护,万一密钥文件泄露了也不至于直接被人用。
查看生成的公钥:
cat ~/.ssh/id_ed25519.pub
复制输出的内容,然后去 GitHub 网站:
- 登录 GitHub → 右上角头像 → Settings
- 左侧菜单 → SSH and GPG keys
- 点击「New SSH key」
- Title 随便填(比如「我的笔记本」),Key 粘贴刚才复制的内容
- 点击「Add SSH key」
测试连接是否成功:
ssh -T git@github.com
如果看到类似 Hi 你的用户名! You've successfully authenticated... 的提示,就说明配置成功了。
git remote set-url origin git@github.com:用户名/仓库名.git。我曾经在这上面吃过亏——明明 SSH Key 配好了,push 的时候还是提示要输密码,检查了半天才发现是远程地址没改。
3.4 从 GitHub 克隆 ArduPilot 源码
现在终于可以下载代码了。ArduPilot 的官方仓库地址是:
git clone git@github.com:ArduPilot/ardupilot.git
这个命令会把整个 ArduPilot 源码下载到当前目录下的 ardupilot 文件夹里。注意,这个仓库很大——包含所有飞控固件、地面站工具、文档和测试代码,大概有 2-3 GB。下载时间取决于你的网速,我当年在学校实验室用教育网下载,花了将近一个小时。
如果你只想下载最新代码,不需要完整的历史记录,可以加 --depth 1 参数:
git clone --depth 1 git@github.com:ArduPilot/ardupilot.git
这样只下载最新的一个版本,速度快很多。不过后面如果你想切换分支或者查看历史,就需要再补全历史记录了。
3.5 理解仓库结构:别迷路
克隆完成后,进入目录看看:
cd ardupilot
ls -la
你会看到很多文件夹。我挑几个重要的说一下:
| 目录/文件 | 说明 |
|---|---|
ArduCopter/ |
多旋翼飞控代码,我们仿真主要用这个 |
ArduPlane/ |
固定翼飞控代码 |
ArduSub/ |
水下机器人代码 |
libraries/ |
核心库,包含传感器驱动、控制算法、数学工具等 |
Tools/ |
辅助工具,包括自动测试脚本、参数文件等 |
mk/ |
编译系统配置文件 |
.gitmodules |
子模块配置文件,ArduPilot 依赖很多第三方库 |
git status 查看当前分支和文件状态。刚克隆完应该是干净的——没有未提交的修改。如果你看到一堆红色文件名,别慌,那可能是换行符或者权限问题,用 git checkout . 可以恢复。
3.6 初始化子模块:补全依赖
ArduPilot 依赖很多第三方库,比如 MAVLink 协议库、数学库等。这些库以 Git 子模块的形式管理。你需要初始化并更新它们:
git submodule update --init --recursive
这个命令会下载所有子模块的代码。注意,--recursive 参数很重要——子模块里面可能还嵌套了子模块。不加这个参数,有些依赖会缺失,编译时会报错。
更新完成后,可以用以下命令查看子模块状态:
git submodule status
如果每个子模块前面都有一个哈希值(没有 - 前缀),说明都初始化成功了。
🔑 核心要点: 子模块是 ArduPilot 开发中容易出问题的地方。我遇到过好几次——明明代码是最新的,编译却报找不到头文件,最后发现是子模块没更新。所以每次拉取最新代码后,记得跑一遍 git submodule update --init --recursive。
3.7 本章知识体系
下面这张图帮你梳理了本章的核心流程:
3.8 避坑指南
最后,我把自己踩过的坑总结一下,你遇到了可以直接对照:
- SSH 连接超时:检查防火墙是否屏蔽了 22 端口。公司网络或校园网经常干这种事。解决办法是用 HTTPS 协议代替,或者联系网络管理员开放端口。
- 克隆速度慢:国内访问 GitHub 有时很慢。可以尝试用代理,或者用 Gitee 的镜像仓库(不过镜像可能不是最新的)。
- 子模块更新失败:网络问题或者子模块仓库地址变更。可以尝试
git submodule sync后再更新。 - 换行符警告:Windows 和 Linux 换行符不同。如果你看到
warning: LF will be replaced by CRLF,不用慌,这是 Git 在帮你做转换。保持默认设置就好。