GitHub中创建私有仓库

一、本地安装 Git 并配置

安装

1
2
3
4
5
6
7
8
9
10
# 安装git
sudo apt update
sudo apt install git

# Git 会将每次提交与一个作者身份关联,因此需要先设置全局的用户名和邮箱
git config --global user.name "你的GitHub用户名"
git config --global user.email "你的GitHub注册邮箱"

# 确认配置是否成功
git config --global --list

配置

  • 查看与 GitHub 连接的密钥

    • 检查是否已有 SSH 密钥

      1
      ls -al ~/.ssh
    • 生成新 SSH 密钥

      关于 ed25519:这是目前推荐的算法,安全性高且性能好。如果系统不支持,可使用 -t rsa -b 4096 生成 RSA 密钥

      1
      ssh-keygen -t ed25519 -C "your email"
    • 启动 ssh-agent 并添加私钥

      1
      2
      eval "$(ssh-agent -s)"
      ssh-add ~/.ssh/id_ed25519
  • 在GitHub中配置生成的密钥

    • 执行命令

      1
      cat ~/.ssh/id_ed25519.pub
    • 在 GitHub 中找到:Settings -> SSH and GPG keys -> New SSH key

    • 将执行命令后生成的密钥,复制输出的全部内容,按上述路径添加 SSH Key

  • 测试 SSH 连接

    1
    ssh -T git@github.com

二、关联与推送本地代码

初始化本地项目

1
2
3
4
cd /path/to/your/project
git init
git add .
git commit -m "Initial commit"

:执行 git add . 之前,请务必确认 .gitignore 已经正确配置。如果不确定,先打开 .gitignore 检查。

关联远程仓库

将本地仓库与一个远程仓库(GitHub)关联起来。其中 origin 是远程仓库的默认别名

1
2
3
4
5
6
7
8
# 没有远程地址时新增
git remote add origin git@github.com:你的用户名/你的仓库名.git
# 有远程地址时修改
git remote set-url origin git@github.com:你的用户名/你的仓库名.git
# 将当前所在分支重命名为main
git branch -m main
# 推送代码
git push -u origin main

后续操作

之后在项目文件夹内进行常规的操作即可

  • git add .
  • git commit -m “commit message”
  • git push

三、添加子模块

本质含义

Git 子模块本质上是一个指向另一个 Git 仓库特定提交(Commit)的“只读指针”。

  • 形式:它会在你的主项目根目录生成一个 .gitmodules 配置文件,里面记录了子仓库的 URL 和本地存放路径。
  • 实质主仓库并不存储子模块的源文件,只存储一个 40 位的提交哈希值(Commit Hash)。当你把主仓库提交到 GitHub 时,GitHub 记录的是“我的某个子目录,应该去哪个仓库的哪个版本取代码”。

核心价值

为什么要用这个“指针”机制,而不是直接把代码复制进来?

  • 解耦与独立演进:子模块可以拥有自己的提交历史、分支和维护者。主项目无需关注子模块的内部开发细节,子模块也能快速迭代,互不干扰。
  • 精确锁定版本(构建可复现性):这是最关键的。主项目通过固定的 Hash 值“钉死”了子模块的版本。无论未来子模块更新了多少次,拉取你主项目的人永远拿到的是你测试通过的那个“老版本”,避免了“在我机器上能跑,在你那不行”的兼容性灾难。
  • 节省空间与多项目复用:你可以在多个不同的主项目中引用同一个公共库(如基础算法库),且每个主项目都可以锁定该库的不同版本,无需把巨大的公共库代码在各处重复拷贝。

实际应用

下面我们通过一个例子来介绍下具体的操作步骤

  • 添加Butterfly主题为子模块

    1
    git submodule add https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly

    这个命令会做三件事:

    1. 将主题仓库克隆到 themes/butterfly 目录。

    2. 在根目录生成 .gitmodules 文件,记录了子模块的路径和URL,这个文件需要提交。

      1. .gitmodules 文件内容大致为:

        1
        2
        3
        [submodule "themes/butterfly"]
        path = themes/butterfly
        url = https://github.com/jerryc127/hexo-theme-butterfly.git
    3. 在主仓库中,将主题文件夹本身记录为一个特殊的“Gitlink”(模式160000),像指针一样锁定它当前的版本(避免因上游主题频繁更新引出的错误)。

    4. 提交更改:

      1
      2
      git add .gitmodules themes/butterfly
      git commit -m "Add butterfly theme as submodule"
  • 将主题添加为子模块后,日常使用会稍作改变:

    • 常规更新:在 themes/butterfly 目录下执行 git pull,然后回到主仓库提交子模块的变更,以更新指针指向新版本。

      1
      2
      3
      4
      5
      6
      7
      8
      # 1. 更新主题
      cd themes/butterfly
      git checkout master # 一般Butterfly主分支为master
      git pull
      cd ../..
      # 2. 提交主仓库的变更
      git add themes/butterfly
      git commit -m "chore: update butterfly theme to latest version"
    • 查看最新Tag(推荐):许多主题会发布稳定版本。你可以进入子模块,切换到指定的发布Tag来获得更稳定的体验。

      1
      2
      3
      4
      5
      6
      cd themes/butterfly
      git tag -l # 列出所有Tag
      git checkout tags/5.5.4 # 切换到指定Tag
      cd ../..
      git add themes/butterfly
      git commit -m "chore: pin butterfly theme to 5.5.4"

      💡 为什么这样更好:这种方式将主题版本牢牢锁定在一个特定Tag上,保证了你和协作者的博客环境完全一致,避免了“跟着master跑,突然出问题”的风险。