自建 Git 之后怎么推代码:配 SSH 或 HTTPS,完成第一次 push

这篇讲 AngusGit 装好之后,怎么把本地已有项目第一次推上去。看完你可以新建一个空仓库,用 SSH 公钥(2222 端口)或 HTTPS 访问令牌完成 git push,并在网页的代码页看到这次提交。

下面假设 AngusGit 已经装好,你能在浏览器里打开它的控制台。对照时用 AngusGit 线上实例上的真实项目:在 git.anguskit.com 的 anguskit 团队下新建仓库 AngusKit,再把本地项目推上去。照着做时,把域名和所有者换成你自己的。

1. 先选一种认证方式

两种方式都能推送。差别在于凭据存在哪里,以及你所在的网络能不能连上 2222 端口。

方式 适用场景与准备 地址长什么样
SSH 自己的开发机长期使用;准备一对 SSH 密钥并把公钥登记到 AngusGit ssh://git@git.anguskit.com:2222/anguskit/AngusKit.git
HTTPS 临时机器、公司网络只放行 80/443 或脚本;准备一把 git:write 访问令牌当密码 https://git.anguskit.com/anguskit/AngusKit.git

线上实例配了证书,所以 HTTPS 地址以 https:// 开头。你自己按「第一次跑通」安装、还没配置证书时,页面上 HTTPS 按钮给出的地址实际以 http:// 开头。复制页面上的地址即可,不要手动把 http 改成 https,否则会连到一个没有监听的 443 端口。

拿不准时选 SSH。登记一次公钥之后,这台电脑上所有仓库都能用,不用记密码,也不用定期换令牌。

2. 新建一个空仓库

  1. 打开表单

    侧栏点 仓库 ,在右上角点 新建仓库 。标题是 创建新仓库。

  2. 填写所有者和名称

    所有者 选你自己的账号,或你所在的团队,示例里选团队 anguskit。它会成为地址的第一段。仓库名称 只能用字母、数字、连字符、下划线和点,示例里填 AngusKit。两段合起来就是 anguskit/AngusKit。可见性 选 私有 时,只有你和你邀请的人能看到。

  3. 不要勾选初始文件

    你要推的是本地已经有的项目时,添加 README 文件 、添加 .gitignore 、选择许可证 三项都保持不选。勾了其中任何一项,远端会先多出一个提交,你的第一次推送会因为两边历史对不上而被拒绝。

  4. 创建

    点 创建仓库。页面跳到这个仓库,副标题是「这是一个空仓库,准备开始你的项目吧!」

空仓库页上有 克隆地址 ,可以在 HTTPS 和 SSH 之间切换。下面还有 全局设置 、创建新仓库(从命令行) 和 推送现有仓库(从命令行) 三段命令,都能整段复制。后面的步骤会用到这一页,先别关。

如果这台电脑从没用过 Git,先执行 全局设置 那两行,写上你的名字和邮箱。它们决定提交记录上显示谁,和认证无关:

bash 复制代码
git config --global user.name "你的名字"
git config --global user.email "you@example.com"

3. 走 SSH:生成密钥并登记公钥

走 HTTPS 的话,跳到第 4 节。

  1. 在自己的电脑上生成密钥

    已经有 ~/.ssh/id_ed25519.pub 时,可以直接用它,跳过这一步。没有的话执行 ssh-keygen -t ed25519 -C "you@example.com",保存路径直接回车用默认值。

  2. 复制公钥

    公钥是以 .pub 结尾的那个文件。执行 cat ~/.ssh/id_ed25519.pub,把输出的一整行(以 ssh-ed25519 开头、以邮箱结尾)复制出来。不带 .pub 的文件是私钥,只留在本机。

  3. 登记到 AngusGit

    在空仓库页点 SSH 旁边的 去配置 ,或者从侧栏 我的 进入 SSH密钥 页签。点 添加SSH密钥 。标题 写一个你认得的名字,例如「办公笔记本」。密钥 粘贴刚才那一整行。点 添加密钥。

本机生成并查看公钥的命令如下:

bash 复制代码
ssh-keygen -t ed25519 -C "you@example.com"
cat ~/.ssh/id_ed25519.pub

AngusGit 的 SSH 默认监听 2222 端口,不是 SSH 常用的 22。页面上的 SSH 地址已经带着端口,例如 ssh://git@git.anguskit.com:2222/anguskit/AngusKit.git。用户名固定是 git,不是你的登录名,AngusGit 靠公钥认出你是谁。

推送之前,可以先确认公钥已经被认出:

bash 复制代码
git ls-remote ssh://git@git.anguskit.com:2222/anguskit/AngusKit.git

第一次连接这台主机时,终端会问是否信任它的指纹,输入 yes。之后命令没有报错、直接结束,就说明认证已经通过。刚建的空仓库里还没有分支,所以这条命令不会打印任何内容。对一个已经有代码、你也有权限读取的仓库执行同样的命令,会打印出分支和对应的提交号,例如 anguskit/AngusGit:

bash 复制代码
git ls-remote ssh://git@git.anguskit.com:2222/anguskit/AngusGit.git
text 复制代码
e21adb350173f2722a546939cdf4ee44004bc8d3	HEAD
e21adb350173f2722a546939cdf4ee44004bc8d3	refs/heads/main

提交号会随仓库更新而变化,能打印出 refs/heads/main 就说明连通了。看到 Permission denied (publickey) 时,对照第 6 节处理。

4. 走 HTTPS:生成访问令牌

走 SSH 的话,跳到第 5 节。

HTTPS 推送时,用户名填你的登录名,密码填一把访问令牌。空仓库页上写着:账号密码也能用于 HTTPS 推送,推荐用令牌,便于回收和控制权限。登录密码一旦写进凭据缓存或脚本,泄露后别人能登录整个控制台;令牌可以只给某几个仓库、只给读或写权限,泄露时单独吊销即可。

  1. 打开令牌页

    在空仓库页点 HTTPS 旁边的 去配置 ,或者从侧栏 我的 进入 访问令牌 页签。点 生成新令牌。

  2. 填写名称和期限

    填写令牌名称,例如「笔记本推送」。过期时间可选 30、60、90 或 365 天。到期之后这把令牌失效,需要再生成一把。最后输入当前的登录密码,确认是你本人在操作。

  3. 选择权限

    权限范围选 git:write。git:read 只能克隆和拉取,用它推送会被拒绝。仓库作用域可以选 全部可访问仓库 ,也可以选 指定仓库 ,只给 anguskit/AngusKit 一个仓库 WRITE。点 生成令牌。

  4. 马上复制

    令牌原文只在这一次完整显示。复制下来,存进你的密码管理器,再点 我已保存此令牌。之后列表里只看得到名称,看不到原文。

为了不每次推送都粘贴令牌,可以让 Git 记住它。macOS 自带钥匙串,Windows 的 Git 安装包自带凭据管理器,第一次输入之后会自动保存。Linux 上可以执行:

bash 复制代码
git config --global credential.helper store

store 会把令牌以明文写进 ~/.git-credentials,只在你自己的电脑上这样用。以后换了新令牌,要把旧的那一条删掉,否则 Git 会一直拿旧令牌去试。

5. 推送本地项目

在本地项目的根目录执行下面三行。它们和空仓库页 推送现有仓库(从命令行) 里的命令相同,第一行的地址换成你在页面上复制的那一个。

bash 复制代码
git remote add origin ssh://git@git.anguskit.com:2222/anguskit/AngusKit.git
git branch -M main
git push -u origin main

走 HTTPS 时,第一行用 https://git.anguskit.com/anguskit/AngusKit.git。执行第三行时,终端会先问 Username,填你自己的登录名(不是团队名 anguskit);再问 Password,粘贴访问令牌。粘贴时屏幕上不显示任何字符,这是正常的,粘贴完直接回车。

第二行把当前分支改名为 main。项目原来的主分支叫 master 时,这一行会把它改成 main,和页面上的默认分支保持一致。

项目已经有一个叫 origin 的远程(例如原来从别处克隆来的),第一行会报 error: remote origin already exists。这时把第一行换成:

bash 复制代码
git remote set-url origin ssh://git@git.anguskit.com:2222/anguskit/AngusKit.git

推送成功时,最后几行会出现 * [new branch] main -> main,以及 branch 'main' set up to track 'origin/main'。回到浏览器刷新仓库页,空仓库的提示消失,你能看到项目的文件和刚才的提交。到这一步,第一次推送就完成了。

以后同事要拿这份代码,在代码页点绿色的 代码 按钮,复制 Clone 面板里的地址执行 git clone。他们同样需要先登记自己的公钥,或生成自己的令牌。

6. 推不上去时

先找到终端里和下表第一列相同的那句话,再按同一行处理。

你看到的 原因 怎么处理
Permission denied (publickey) AngusGit 没有认出你的公钥。常见的是公钥没登记、粘贴时少了一截,或者本机用的是另一把私钥 到 我的 → SSH密钥 确认列表里有这把钥匙,并且是整行粘贴的。本机有多把密钥时,见本节后面的 ~/.ssh/config 写法
Connection refused,或者一直卡住后 Connection timed out 客户端连的是 22 端口,或者服务器防火墙没有放行 2222 改用页面上带 :2222 的 ssh:// 地址。仍然连不上时,请管理员确认 2222 已放行
Authentication failed for 'https://git.anguskit.com/anguskit/AngusKit.git/' 令牌已过期或已吊销;用户名填的不是令牌主人的登录名;或者系统里还缓存着一把旧令牌 到 我的 → 访问令牌 看令牌是否还在有效期内,必要时重新生成一把。用户名填你自己的登录名。缓存过旧令牌时,先在钥匙串或凭据管理器里删掉旧的那一条,再推送
用 HTTPS 推送被拒绝,克隆却正常 令牌的权限是 git:read,或者 指定仓库 里没给这个仓库 WRITE 生成一把 git:write 的令牌,并确认它覆盖这个仓库
! [rejected] main -> main (fetch first) 远端已经有你本地没有的提交,最常见的是建仓时勾了 README 执行 git pull --rebase origin main,把远端那个提交接到本地之前,再推送。远端那份 README 不需要时,也可以删掉这个仓库,按第 2 节重建一个空仓库
Branch 'main' is protected: direct push is not allowed, please open a pull request 仓库的 main 已经加了分支保护,不接受直接推送 推到一个新分支,再在网页上发起拉取请求,见文末参考里的分支保护一文

本机有多把 SSH 密钥,或者不想每次都在地址里写端口时,在 ~/.ssh/config 里加上这一段。之后 ssh 和 git 连 git.anguskit.com 时,都会用 2222 端口和指定的那把私钥:

text 复制代码
Host git.anguskit.com
  Port 2222
  User git
  IdentityFile ~/.ssh/id_ed25519

常见问题

SSH 和 HTTPS 能同时用吗?

能。同一个账号可以既登记公钥,又持有令牌。一个仓库在本地用哪种方式,取决于 git remote -v 里那个地址的开头是 ssh:// 还是 http。

为什么推荐用令牌,而不是登录密码?

登录密码写进脚本或凭据缓存,一旦泄露,别人就能登录整个控制台。令牌可以只给某几个仓库、只给读或写权限,到期自动失效,泄露时单独吊销即可,不影响你的登录。改登录密码也不会让已经配好的 Git 推送失效。

令牌过期了,要改登录密码吗?

不用。到 我的 → 访问令牌 再生成一把,把凭据缓存里的旧令牌换掉即可。

换了一台电脑怎么办?

在新电脑上重新生成一对密钥,把新的公钥再登记一次。每台电脑一把钥匙,以后某台电脑丢了,只删它那一把就行。

CI 机器拉代码,也要用我的个人公钥吗?

不需要。仓库 设置 → Deploy Keys 可以给机器单独登记一把只读或读写的公钥,它只对这一个仓库有效,和任何人的个人账号无关。

小结

第一次推送只需要做对三件事:新建仓库时不勾初始文件;SSH 走 2222 端口、用户名是 git,HTTPS 的密码填访问令牌;远程地址直接复制页面上的那一个。推上去之后,下一步通常是给 main 加上保护,让以后的改动都经过拉取请求和评审再合进去。

结论: 推送已有本地项目时,新建仓库不勾选 README,选 SSH(在 我的 → SSH密钥 登记公钥,地址带 :2222)或 HTTPS(密码填 我的 → 访问令牌 的 git:write 令牌)执行 git push -u origin main。

参考文章

相关推荐
LEE1 小时前
别把 Agent 架构画成组织架构图——子代理该不该拆,用任务级 Eval 说话
前端·后端·ai编程
合尘猫1 小时前
词元涨价近一倍后,我把 AI 客服的成本拆成了四个可优化的变量
人工智能·后端·架构
用户574385305111 小时前
# 第 12 步:操作日志 + RBAC 缓存失效 + 业务模块
后端
用户574385305111 小时前
# 织链塔:12 步从零造一个 Koa 后端框架 —— 第 4 步:JSON 条件编译引擎(buildWhere)
后端
coderCN1 小时前
NestJS + Prisma + PostgreSQL
后端
苍何2 小时前
开源微信流 APP,手机微信聊天记录,可以直接给 WorkBuddy 和 Obsidian 了
后端
智驭未来掌门人2 小时前
Qt 项目不建议导入 CLion 说明
后端
Lumos_2 小时前
P1 签名 (PKCS#1) vs 裸签 (Raw Signature)
后端
今天早睡2 小时前
调用真实模型,用 Pydantic 校验后再路由
后端