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 的步骤:

  1. 打开终端(Windows 用 Git Bash)
  2. 运行以下命令:
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... 的提示,就说明配置成功了。

⚠️ 常见坑: 如果你之前用过 HTTPS 方式克隆过仓库,记得把远程地址改成 SSH 格式: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 本章知识体系

下面这张图帮你梳理了本章的核心流程:

Git与代码管理流程 Git 与代码管理核心流程 安装 Git 配置用户身份 生成 SSH Key 添加到 GitHub 克隆 ArduPilot 初始化子模块 💡 说明: 子模块初始化是容易遗漏的步骤。每次拉取最新代码后,记得执行 git submodule update --init --recursive。

3.8 避坑指南

最后,我把自己踩过的坑总结一下,你遇到了可以直接对照:

  • SSH 连接超时:检查防火墙是否屏蔽了 22 端口。公司网络或校园网经常干这种事。解决办法是用 HTTPS 协议代替,或者联系网络管理员开放端口。
  • 克隆速度慢:国内访问 GitHub 有时很慢。可以尝试用代理,或者用 Gitee 的镜像仓库(不过镜像可能不是最新的)。
  • 子模块更新失败:网络问题或者子模块仓库地址变更。可以尝试 git submodule sync 后再更新。
  • 换行符警告:Windows 和 Linux 换行符不同。如果你看到 warning: LF will be replaced by CRLF,不用慌,这是 Git 在帮你做转换。保持默认设置就好。