这篇讲 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. 新建一个空仓库
-
打开表单
侧栏点 仓库 ,在右上角点 新建仓库 。标题是 创建新仓库。
-
填写所有者和名称
所有者 选你自己的账号,或你所在的团队,示例里选团队
anguskit。它会成为地址的第一段。仓库名称 只能用字母、数字、连字符、下划线和点,示例里填AngusKit。两段合起来就是anguskit/AngusKit。可见性 选 私有 时,只有你和你邀请的人能看到。 -
不要勾选初始文件
你要推的是本地已经有的项目时,添加 README 文件 、添加 .gitignore 、选择许可证 三项都保持不选。勾了其中任何一项,远端会先多出一个提交,你的第一次推送会因为两边历史对不上而被拒绝。
-
创建
点 创建仓库。页面跳到这个仓库,副标题是「这是一个空仓库,准备开始你的项目吧!」
空仓库页上有 克隆地址 ,可以在 HTTPS 和 SSH 之间切换。下面还有 全局设置 、创建新仓库(从命令行) 和 推送现有仓库(从命令行) 三段命令,都能整段复制。后面的步骤会用到这一页,先别关。
如果这台电脑从没用过 Git,先执行 全局设置 那两行,写上你的名字和邮箱。它们决定提交记录上显示谁,和认证无关:
bash
git config --global user.name "你的名字"
git config --global user.email "you@example.com"
3. 走 SSH:生成密钥并登记公钥
走 HTTPS 的话,跳到第 4 节。
-
在自己的电脑上生成密钥
已经有
~/.ssh/id_ed25519.pub时,可以直接用它,跳过这一步。没有的话执行ssh-keygen -t ed25519 -C "you@example.com",保存路径直接回车用默认值。 -
复制公钥
公钥是以
.pub结尾的那个文件。执行cat ~/.ssh/id_ed25519.pub,把输出的一整行(以ssh-ed25519开头、以邮箱结尾)复制出来。不带.pub的文件是私钥,只留在本机。 -
登记到 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 推送,推荐用令牌,便于回收和控制权限。登录密码一旦写进凭据缓存或脚本,泄露后别人能登录整个控制台;令牌可以只给某几个仓库、只给读或写权限,泄露时单独吊销即可。
-
打开令牌页
在空仓库页点 HTTPS 旁边的 去配置 ,或者从侧栏 我的 进入 访问令牌 页签。点 生成新令牌。
-
填写名称和期限
填写令牌名称,例如「笔记本推送」。过期时间可选 30、60、90 或 365 天。到期之后这把令牌失效,需要再生成一把。最后输入当前的登录密码,确认是你本人在操作。
-
选择权限
权限范围选
git:write。git:read只能克隆和拉取,用它推送会被拒绝。仓库作用域可以选 全部可访问仓库 ,也可以选 指定仓库 ,只给anguskit/AngusKit一个仓库 WRITE。点 生成令牌。 -
马上复制
令牌原文只在这一次完整显示。复制下来,存进你的密码管理器,再点 我已保存此令牌。之后列表里只看得到名称,看不到原文。
为了不每次推送都粘贴令牌,可以让 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。