«

从混乱到规范:YOLOv8 CPU训练项目GitHub上传全流程(超详细避坑指南)

从0至1 • 19 天前 • 76 次点击 • 灵感迸发


从混乱到规范:YOLOv8 CPU训练项目GitHub上传全流程(超详细避坑指南)

一、前言

作为一名开发者,将本地项目上传到 GitHub 是基础操作,但实际过程中容易遇到 SSH 配置、分支冲突、提交记录混乱、空文件夹不上传等问题。本文以「YOLOv8 CPU 训练项目」为例,详细记录从本地代码初始化到 GitHub 规范托管的完整流程,包含「环境配置→SSH 密钥→本地提交→远程推送→分支清理→记录重置」6 大阶段,补充 10+ 操作截图说明、命令参数解析、分步验证细节,以及 6 个高频易错点的深度原因和多重解决方案,适合新手直接套用,也可作为问题排查手册。

二、核心需求

  1. 将本地 YOLOv8 CPU 训练项目(含中文命名文件、多文件夹,部分文件夹曾为空)完整上传到 GitHub;

  2. 统一使用 main 分支作为默认分支,删除冗余的 master 分支,对齐 GitHub 主流规范;

  3. 提交记录清晰简洁,避免重复提交、注释模糊、历史记录混乱等问题;

  4. 确保所有文件夹(包括曾为空的文件夹)都能在 GitHub 上正常显示,无缺失。

三、前期准备(含细节补充)

1. 环境配置(分步验证)

git config --global user.name "用户名"  # 替换为你的 GitHub 用户名

git config --global user.email "邮箱"  # 替换为你的 GitHub 注册邮箱
git config --global --list  # 输出中能看到 user.name=用户名、user.email=邮箱 即为成功
  1. 登录 GitHub 后,点击右上角「+」号 → 选择「New repository」(新建仓库);

  2. 仓库配置页面填写(截图对应区域说明):

2. 项目结构(带文件功能说明)

new\_train/  # 本地项目根目录(需与仓库名保持一致,便于管理)

├─ README.md  # 项目说明文档(含环境配置步骤、依赖安装、训练命令、文件说明)

├─ train\_.py  # 核心训练脚本(YOLOv8 CPU 训练主程序,含数据加载、模型初始化、训练循环)

├─ train\_v1.1.py  # 训练脚本迭代版(优化数据增强逻辑、修复 CPU 推理速度瓶颈)

├─ requirements.txt  # 依赖清单(明确版本号,避免环境冲突,如 ultralytics==8.0.180、numpy==1.24.3)

├─ yolov8n.pt  # YOLOv8 纳米版预训练模型(CPU 推理轻量化选择,文件大小约 6MB)

├─ 训练脚本.py  # 中文命名辅助脚本(测试 CPU 环境兼容性,验证中文文件名是否正常识别)

├─ config/  # 配置文件夹(存放训练、推理相关参数配置)

│  ├─ total\_config.yaml  # 核心配置文件(设置学习率、迭代次数、批量大小、数据集路径等)

│  └─ total\_config - 备份.yaml  # 配置文件备份(避免误改后无法恢复)

├─ dataset/  # 数据集文件夹(初始为空,后补充测试文件确保文件夹上传)

│  └─ test/  # 测试数据集子文件夹

│     └─ 测试图片说明.txt  # 占位文件(原文件夹为空,添加后可被 Git 跟踪)

├─ output/  # 输出文件夹(存放训练日志、推理结果)

│  └─ 训练日志.txt  # 训练过程日志(记录损失值、精度变化)

├─ runs/  # 训练结果文件夹(存放模型权重、验证指标图)

│  └─ 训练结果说明.txt  # 占位文件(确保文件夹被 Git 识别)

└─ scripts/  # 辅助脚本文件夹(存放数据预处理、结果可视化脚本)

   └─ auto\_process\_dataset.py  # 数据集自动处理脚本(批量转换标注格式、划分训练/验证集)

说明:

dataset/

runs/

初始为空,若不添加占位文件(如

.gitkeep

说明.txt

),Git 会忽略这些文件夹,导致上传后 GitHub 看不到。

四、完整操作流程(分阶段 + 分步验证 + 截图说明)

阶段 1:SSH 密钥配置(免密认证核心,解决连接问题)

目标:配置本地 SSH 密钥并关联 GitHub,实现本地仓库与远程仓库的免密通信,避免 HTTPS 连接的各种问题。

步骤 1.1:生成 SSH 密钥(本地操作)
  1. 打开 Git Bash 终端(Windows 可通过「开始菜单→Git→Git Bash」启动,终端图标为黑色背景白色文字);

  2. 输入密钥生成命令(ED25519 算法更安全,推荐使用):

ssh-keygen -t ed25519 -C "邮箱"  # 引号内替换为你的 GitHub 注册邮箱(与前期配置一致)
  1. 执行命令后,终端会提示以下信息,全程按回车键(Enter)确认,无需输入额外内容
  1. 生成成功后,终端会显示密钥指纹和随机艺术图案(无需记录,确认生成即可)。
步骤 1.2:查看并复制公钥(本地操作)
  1. 输入命令,查看公钥文件内容:
cat \~/.ssh/id\_ed25519.pub  # 读取 ED25519 算法的公钥文件
  1. 终端输出类似以下内容,复制完整公钥(从 ssh-ed25519 开头到邮箱结尾,包括所有字符,不要遗漏或多复制空格)
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILXzU8cG8R9z6X3nQwMfEe9QZ7X7aZ9X7bZ8X9cZ0X1Y2Z3X4Y5Z6 邮箱

易错点:复制时若遗漏字符或多复制换行,会导致后续 SSH 验证失败,建议用鼠标选中后右键复制(Git Bash 中选中即复制)。

步骤 1.3:在 GitHub 中添加公钥(网页操作)
  1. 登录 GitHub 账号,点击右上角头像 → 选择「Settings」(设置);

  2. 在左侧菜单栏中,找到并点击「SSH and GPG keys」(SSH 和 GPG 密钥);

  3. 点击页面右上角「New SSH key」(新建 SSH 密钥);

  4. 填写密钥信息(截图对应区域说明):

  1. 点击页面底部「Add SSH key」(添加 SSH 密钥),完成配置。
步骤 1.4:验证 SSH 连接(本地操作)
  1. 在 Git Bash 中输入验证命令:
ssh -T git@github.com
  1. 首次验证时,终端会提示「是否继续连接」,输入 yes(小写,无需加引号),按回车键:
The authenticity of host 'github.com (140.82.114.4)' can't be established.

ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.

This key is not known by any other names

Are you sure you want to continue connecting (yes/no/\[fingerprint])? yes
  1. 若验证成功,终端会输出:
Hi 用户名! You've successfully authenticated, but GitHub does not provide shell access.

(提示:“GitHub does not provide shell access” 是正常信息,无需担心)

易错点 1:SSH 验证提示「Permission denied (publickey)」
  1. 公钥复制不完整(漏开头「ssh-ed25519」或结尾邮箱);

  2. 本地生成的密钥文件与 GitHub 配置的密钥算法不一致(如本地用 RSA,GitHub 粘贴的是 ED25519);

  3. Windows 系统下 .ssh 文件夹权限过高(Git 拒绝使用权限开放的密钥文件)。

  1. 重新生成并复制公钥:按步骤 1.1-1.2 重新操作,确保公钥完整复制(无换行、无多余字符);

  2. 检查密钥算法一致性:若本地用 RSA 算法(命令 ssh-keygen -t rsa -C "邮箱"),则复制 ~/.ssh/id_rsa.pub 中的公钥;

  3. 调整 .ssh 文件夹权限(Windows):

阶段 2:本地仓库初始化与文件提交(确保所有文件被跟踪)

目标:将本地项目文件夹初始化为 Git 仓库,添加所有文件到暂存区,提交到本地仓库,确保中文文件、空文件夹(含占位文件)都被正确跟踪。

步骤 2.1:进入本地项目根目录(本地操作)
  1. 在 Git Bash 中输入命令,切换到本地项目根目录(需替换为你的实际路径):
cd /c/Users/你的Windows用户名/Desktop/new\_train  # 示例路径,需根据实际修改

验证:输入

ls

命令(列出当前目录文件),若输出与项目结构一致(如

README.md

train_.py

等),说明路径正确。

步骤 2.2:初始化 Git 仓库(本地操作)
  1. 输入初始化命令,将当前文件夹变为 Git 可管理的仓库:
git init
  1. 成功后终端输出:Initialized empty Git repository in C:/Users/你的Windows用户名/Desktop/new_train/.git/(表示本地仓库创建成功,根目录下会生成隐藏的 .git 文件夹,用于存储仓库配置和提交记录)。
步骤 2.3:处理空文件夹(确保文件夹被跟踪)
  1. 如项目结构中 dataset/test/runs/ 等文件夹初始为空,需添加占位文件(Git 不跟踪空文件夹):
\# 给每个空文件夹添加 .gitkeep 占位文件(约定俗成的命名,Git 不会忽略)

touch dataset/test/.gitkeep

touch runs/.gitkeep

touch output/.gitkeep  # 若 output 文件夹为空,同样添加

替代方案:也可添加

README.md

说明.txt

(含文件夹功能说明),比

.gitkeep

更实用(他人查看仓库时能了解文件夹用途)。

步骤 2.4:添加所有文件到暂存区(本地操作)
  1. 输入命令,将项目中所有文件(包括子目录、中文文件、占位文件)添加到 Git 暂存区:
git add .
步骤 2.5:提交文件到本地仓库(本地操作)
  1. 输入提交命令,将暂存区的文件提交到本地仓库,并填写清晰的提交注释(便于后续查看提交记录):
git commit -m "初始化YOLOv8 CPU训练项目:包含核心训练脚本、配置文件、数据集文件夹、预训练模型、依赖清单"
  1. 成功后终端输出类似内容(表示所有文件提交成功):
\[master (root-commit) e5f8989] 初始化YOLOv8 CPU训练项目:包含核心训练脚本、配置文件、数据集文件夹、预训练模型、依赖清单

13 files changed, 1313 insertions(+)

create mode 100644 README.md

create mode 100644 "训练脚本.py"

create mode 100644 config/total\_config.yaml

...(列出所有新增文件)
易错点 2:空文件夹上传后 GitHub 看不到
  1. 给空文件夹添加占位文件(如 .gitkeepREADME.md),再执行 git add .

  2. 验证:提交后输入 git status,若文件夹下的占位文件显示为「committed」,说明已被跟踪;

  3. 后续若给文件夹添加实际文件,可删除占位文件(执行 rm 文件夹/.gitkeep),再提交更新。

易错点 3:Git Bash 中中文文件名显示乱码(如 \350\256\255...
  1. 临时解决(当前终端有效):输入命令 export LANG=zh_CN.GBK,中文文件名会正常显示;

  2. 永久解决(所有终端有效):

阶段 3:关联远程仓库并强制推送(避免冲突,确保内容一致)

目标:将本地仓库与 GitHub 空白仓库建立关联,通过强制推送覆盖远程内容(因远程是空白仓库,强制推送无风险),确保本地所有文件上传到 GitHub main 分支。

步骤 3.1:关联 GitHub 远程仓库(本地操作)
  1. 输入命令,关联之前新建的 GitHub 空白仓库(替换为你的 SSH 地址):
git remote add origin git@github.com:用户名/yolov8-cpu-training.git
  1. 验证关联是否成功:
git remote -v

若输出以下内容,说明关联成功(显示远程仓库的 fetch 和 push 地址):

origin  git@github.com:用户名/yolov8-cpu-training.git (fetch)

origin  git@github.com:用户名/yolov8-cpu-training.git (push)
步骤 3.2:强制推送本地内容到远程 main 分支(本地操作)
  1. 输入强制推送命令(因本地仓库是全新提交,远程是空白仓库,强制推送无风险):
git push -f origin master:main
  1. 成功后终端输出类似内容(表示所有文件已上传到远程 main 分支):
Enumerating objects: 13, done.

Counting objects: 100% (13/13), done.

Delta compression using up to 12 threads

Compressing objects: 100% (13/13), done.

Writing objects: 100% (13/13), 5.80 MiB | 2.20 MiB/s, done.

Total 13 (delta 0), reused 0 (delta 0), pack-reused 0

To github.com:用户名/yolov8-cpu-training.git

\* \[new branch]      master -> main (forced update)
步骤 3.3:将本地分支重命名为 main(对齐远程规范)
  1. 为了让本地分支名与远程分支名一致(均为 main,便于后续操作),输入重命名命令:
git branch -M main
  1. 验证重命名成功:
git branch  # 输出 \`\* main\`,表示当前分支是 main
  1. 重新建立本地与远程 main 分支的跟踪关系(后续推送无需写分支名):
git push -u origin main
易错点 4:推送时提示「! [rejected] main -> main (fetch first)」

注意:多人协作仓库禁止使用

git push -f

,会覆盖他人提交记录,导致代码丢失。

  1. 场景 1:远程仓库是新建的,仅含 README 等初始文件(无重要内容)→ 强制推送覆盖(单人仓库首选):
git push -f origin main  # 强制覆盖远程内容,本地内容为准
  1. 场景 2:远程仓库有重要内容(如他人协作提交)→ 先拉取合并再推送:
git pull origin main --allow-unrelated-histories  # 拉取远程内容并合并(--allow-unrelated-histories 解决无关联历史冲突)

git push origin main  # 合并后推送
易错点 5:关联远程仓库时提示「fatal: remote origin already exists」
  1. 先删除旧的关联:
git remote remove origin
  1. 重新执行关联命令:
git remote add origin git@github.com:用户名/yolov8-cpu-training.git
  1. 验证:git remote -v 查看是否关联正确。

阶段 4:清理冗余分支(删除 master 分支,统一 main 分支)

目标:删除 GitHub 上可能存在的 master 分支(若有),仅保留 main 分支作为默认分支,对齐 GitHub 主流规范(GitHub 现已将默认分支名从 master 改为 main)。

步骤 4.1:查看远程分支(本地操作)
  1. 输入命令,查看 GitHub 上的分支列表:
git branch -r
步骤 4.2:删除远程 master 分支(本地操作)
  1. 输入删除命令:
git push origin --delete master
  1. 成功后终端输出:To github.com:用户名/yolov8-cpu-training.git - [deleted] master(表示远程 master 分支已删除)。
步骤 4.3:处理删除失败(提示「Cannot delete the default branch」)
  1. 打开 GitHub 仓库 → 点击顶部「Settings」→ 左侧菜单栏「Branches」;

  2. 在「Default branch」(默认分支)下拉框中,选择 main 分支;

  3. 点击下拉框下方「Update」按钮(更新默认分支);

  4. 回到 Git Bash,重新执行 git push origin --delete master,即可成功删除。

阶段 5:提交记录重置(针对历史记录混乱的补救方案)

目标:若之前推送过错误提交(如注释模糊、重复提交、分支冲突导致的混乱记录),可通过 “本地重置 + 强制推送” 清理历史,重新上传干净的提交记录(本文前期已用此方案解决混乱问题)。

步骤 5.1:本地仓库重置(删除旧提交记录)
  1. 进入本地项目根目录,输入命令删除旧的 Git 配置(谨慎!会清除所有本地提交记录,仅保留文件):
rm -rf .git  # 删除隐藏的 .git 文件夹,彻底重置本地仓库
  1. 重新初始化仓库、添加文件、提交(与阶段 2 步骤一致):
git init  # 重新初始化

git add .  # 添加所有文件(含占位文件)

git commit -m "初始化YOLOv8 CPU训练项目:核心脚本+配置+数据集+预训练模型"  # 清晰注释
步骤 5.2:强制推送覆盖远程(清理远程历史记录)
  1. 重新关联远程仓库(若之前删除过关联):
git remote add origin git@github.com:用户名/yolov8-cpu-training.git
  1. 强制推送本地全新提交,覆盖远程所有历史记录:
git push -f origin main
  1. 验证:GitHub 仓库提交记录中仅保留一条清晰的初始化提交,无任何混乱历史。
易错点 6:重置后推送提示「failed to push some refs to 'git@github.com:...'」
  1. 单人仓库(无他人协作):再次执行强制推送(确保本地内容覆盖远程):
git push -f origin main
  1. 有他人协作:先拉取远程内容,手动解决冲突后再推送(不推荐重置历史,会影响他人工作)。

五、最终验证(确保所有需求达成)

打开 GitHub 仓库页面(https://github.com/用户名/yolov8-cpu-training),按以下 4 点验证:

  1. 提交记录验证:仓库主页顶部「Latest commit」显示唯一一条提交记录,注释为「初始化 YOLOv8 CPU 训练项目:核心脚本 + 配置 + 数据集 + 预训练模型」(无重复、无模糊注释);

  2. 文件完整性验证:仓库文件列表与本地项目结构一致,所有文件夹(config/dataset/scripts/ 等)和文件(含中文命名文件、预训练模型 yolov8n.pt)都完整显示,无缺失;

  3. 分支状态验证:仓库顶部分支下拉框中仅显示 main 分支(无 master 分支),默认分支为 main

  4. SSH 关联验证:后续修改本地文件后,执行 git add .git commit -m "更新说明"git push,无需输入密码即可成功推送(免密认证生效)。

六、后续常规操作(代码更新流程)

上传成功后,后续修改代码、新增文件时,只需执行以下 3 步(无需重复配置):

  1. 修改本地文件:如优化 train_.py 逻辑、新增 data_visualization.py 脚本、更新 requirements.txt 依赖等;

  2. 提交到本地仓库

git add .  # 添加所有修改/新增的文件

git commit -m "优化CPU训练速度:修复数据加载瓶颈"  # 清晰说明更新内容
  1. 推送到 GitHub
git push  # 已建立跟踪关系,无需写分支名和仓库地址

七、总结(核心流程 + 避坑要点)

1. 核心流程(精简版,可直接套用)

graph TD
    A[环境配置:Git + GitHub 空白仓库] --> B[SSH 密钥配置:生成→复制→添加→验证]
    B --> C[本地操作:初始化仓库→添加占位文件→add→commit]
    C --> D[关联远程仓库:git remote add origin SSH地址]
    D --> E[推送:git push -f origin master:main]
    E --> F[清理分支:删除master→设置main为默认分支]
    F --> G[后续更新:add→commit→push]

2. 核心避坑要点

3. 常见问题速查

问题现象 直接解决方案
SSH 验证 Permission denied 重新生成并复制完整公钥,调整 .ssh 文件夹权限
空文件夹上传后看不到 添加 .gitkeep 占位文件,重新 add + commit + push
推送提示 rejected (fetch first) 单人仓库:git push -f origin main;协作仓库:git pull --allow-unrelated-histories
中文文件名乱码 Git Bash 中执行 export LANG=zh_CN.GBK,或修改终端编码为 GBK
无法删除 master 分支 先在 GitHub 把默认分支改为 main,再执行删除命令

通过本文流程,可实现本地项目到 GitHub 的规范上传,解决提交记录混乱、文件缺失、连接失败等常见问题。对于新手而言,无需纠结 Git 高级功能,掌握 “初始化→add→commit→push” 核心流程 + 本文避坑要点,即可顺利完成代码托管。后续若需多人协作、分支管理、版本回滚等功能,可进一步探索 Git 进阶用法。

我的矩阵
抖音:从 0 至 1
微信公众号:从 0 至 1
博客网站:www.from0to1.cn
github: https://github.com/mtnljbydd


扫描二维码,在手机上阅读
文章目录


    收藏
    还没收到回复
    请先 登录 再回复