在服务器上创建一个私有化的git
🚀 1. 在 Ubuntu 服务器创建一个 gituser(如果已经有可跳过)
sudo adduser gituser
设置密码 → 完成。
🚀 2. 把本地 Windows 的 SSH Key 放到服务器上(强烈推荐)
▶️(1)本地 Windows 生成 SSH key
在 PowerShell 输入:
ssh-keygen -t ed25519 -C "yourname"
一路按回车,默认生成:
C:\Users\你的用户名\.ssh\id_ed25519
C:\Users\你的用户名\.ssh\id_ed25519.pub
▶️(2)把公钥上传到 Ubuntu 服务器(推荐 ssh-copy-id,如果没有可手动):
如果你能用 root 登录:
ssh-copy-id -i ~/.ssh/id_ed25519.pub gituser@服务器IP
如果没有 ssh-copy-id 就手动:
mkdir -p /home/gituser/.ssh
chmod 700 /home/gituser/.ssh
把 Windows 的 id_ed25519.pub 内容复制并写入:
nano /home/gituser/.ssh/authorized_keys
保存,设置权限:
chmod 600 /home/gituser/.ssh/authorized_keys
chown -R gituser:gituser /home/gituser/.ssh
🚀 3. SSH 登录服务器的 gituser 账户
从 Windows:
ssh gituser@服务器IP
如果成功代表 SSH key 配置成功。
🚀 4. 在服务器创建一个 Git 远程仓库(Bare Repo)
例如托管你的项目:
su - gituser
mkdir -p ~/repos/myproject.git
cd ~/repos/myproject.git
git init --bare
你现在得到了一个远程仓库:
gituser@服务器IP:~/repos/myproject.git
🚀 5. 本地 Windows 上初始化 Git 项目
进入你的代码目录:
cd D:\MatchCode\DataMining
git init
git add .
git commit -m "first commit"
🚀 6. 添加远程仓库
git remote add origin gituser@服务器IP:~/repos/myproject.git
🚀 7. 推送到服务器(第一次可能需要 master/main)
git push -u origin master
成功看到推送,表示整个链路畅通。
🚀 8. 服务器 clone 出工作目录(非 bare)
bare 仓库不能直接运行,必须 checkout 一份:
在服务器:
cd ~
git clone ~/repos/myproject.git myproject
以后更新可执行:
cd ~/myproject
git pull
❤️ 到此完成!本地 Windows 开发 → 一键推送到 Ubuntu 服务器
流程图:
Windows 开发代码
│
│ git push
▼
Ubuntu 24.04 (gituser)
~/repos/myproject.git (bare repo)
│
│ git clone / git pull
▼
~/myproject (真正运行的代码目录)
你的服务器可以同时拥有多个独立项目,每个项目一个独立的 bare 仓库,例如:
~/repos/project1.git
~/repos/project2.git
~/repos/my_flask_app.git
~/repos/my_ai_model.git
~/repos/myproject_new.git
只要你愿意,可以建 100 个都没问题。
下面给你一个最清晰、最实用的多项目同步模板。
✅ 1. 在服务器创建新的仓库 myproject_new.git
以 gituser 身份:
mkdir -p ~/repos/myproject_new.git
cd ~/repos/myproject_new.git
git init --bare
✅ 2. 本地 Windows 新项目链接这个远程仓库
假设你本地新项目目录是:
D:\Projects\myproject_new
初始化:
cd D:\Projects\myproject_new
git init
git add .
git commit -m "init project"
添加远程:
git remote add origin gituser@服务器IP:~/repos/myproject_new.git
推送:
git push -u origin master
成功!
✅ 3. 服务器上 clone 出可运行目录(非 bare)
仍然是 gituser:
cd ~
git clone ~/repos/myproject_new.git myproject_new
以后更新的时候,到:
~/myproject_new
运行:
git pull
🔥 完整示例:你的多个项目会这样组织
/home/gituser/
├── repos/
│ ├── myproject.git
│ ├── myproject_new.git
│ ├── webapp.git
│ └── ai_service.git
│
├── myproject/
│ └── (真正运行的代码)
├── myproject_new/
│ └── (真正运行的代码)
├── webapp/
└── ai_service/
每个项目开发-同步流程:
-
在 Windows 编写代码
-
git add . && git commit -m "update" -
git push -
在服务器
cd ~/myproject_new && git pull
顺滑无比。
下面给你一套 最标准、最稳妥、一步到位 的流程。
你只需要 复制粘贴 即可把本地:
D:\MatchCode\DataMining
同步到你服务器的 bare 仓库:
~/repos/DataMining.git (gituser 用户)
✅ 第一步:服务器端(Ubuntu 24.04)创建 bare 仓库
你现在应该用 gituser 登录服务器,如果你还在 root 下,请先切换:
su - gituser
然后创建仓库目录:
mkdir -p ~/repos/DataMining.git
cd ~/repos/DataMining.git
git init --bare
现在你的服务器仓库已准备好接收 push。
✅ 第二步:本地(Windows 11)给你的项目添加 remote
打开 PowerShell,进入你的项目目录:
cd D:\MatchCode\DataMining
查看本地是否已初始化 Git:
git status
如果未初始化:
git init
git add .
git commit -m "Initial commit"
再添加远程仓库 origin:
git remote add origin gituser@服务器IP:~/repos/DataMining.git
✔ 注意,gituser@服务器IP 前不要加 ssh://
✔ ~/repos/DataMining.git 不要漏 .git
✅ 第三步:把本地全部代码推送到服务器
如果你本地分支叫 main(新版 Git 默认如此):
git push -u origin main
如果你本地分支叫 master:
git push -u origin master
如果你不确定你当前分支叫什么:
git branch
看到前面有 * 的就是当前分支。
🚨 若推送时报错(常见):
error: failed to push some refs...
说明服务器端仓库不是完全空的,可以强推:
git push -u origin main --force
或者 master:
git push -u origin master --force
✅ 第四步:确认服务器端是否成功接收
服务器端执行:
cd ~/repos/DataMining.git
查看是否有 objects :
du -sh .
如果有几十 KB ~ 几 MB,则说明接收成功。
如果你需要部署实际代码(不是 bare 仓库),可以 clone:
cd ~
git clone ~/repos/DataMining.git DataMining
服务器的实际运行目录:
~/DataMining/
在你的 本地 Windows 项目目录 下,只需要执行一条命令即可删除这个远端服务器配置:
✅ 删除 origin 远程仓库
进入你的项目目录:
cd D:\MatchCode\DataMining
删除远程仓库 origin:
git remote remove origin
或者:
git remote rm origin
两种写法完全一样。
✅ 查看是否已经删除成功
git remote -v
如果没有任何输出,说明远程仓库已经被移除。
🔧 如果你有多个远端(比如 origin、backup、prod),也可以分别删除:
git remote rm backup
git remote rm prod
要在 另外一台电脑 / 本地其他目录 克隆你服务器上的仓库,只需要执行一次标准的 git clone:
✅ 克隆服务器上的 Git 仓库(标准方式)
在任意本地目录执行:
git clone gituser@服务器IP:~/repos/DataMining.git
例如:
git clone gituser@1.2.3.4:~/repos/DataMining.git
克隆后会生成一个目录 DataMining:
DataMining/
├── app.py
├── src/
├── ...
🔑 注意:你必须保证服务器的 gituser 有读权限
你之前应该执行了(或者我帮你写过):
sudo chown -R gituser:gituser /home/gituser/repos
仓库属于 gituser,你用 gituser@IP 登录时就没问题。
🔧 如果你使用 SSH key(推荐)
本地生成 key:
ssh-keygen -t rsa -b 4096
复制公钥到服务器:
ssh-copy-id gituser@服务器IP
然后就可以 免密码 clone:
git clone gituser@服务器IP:~/repos/DataMining.git
📌 常见错误与解决方式
❌ Permission denied (publickey)
说明服务器没加入本地的公钥,重新执行:
ssh-copy-id gituser@服务器IP
❌ fatal: 'repos/DataMining.git' does not appear to be a git repository
说明你没有初始化裸仓库,请确认服务器端目录结构:
ls -l /home/gituser/repos
应该看到:
DataMining.git/
里面应该有:
HEAD
config
refs/
objects/
hooks/
进一步
安装 Gitea
Gitea 是轻量的 Git 服务器,超级简单,支持:
✔ 网页界面(像 GitHub)
✔ 项目管理
✔ SSH + HTTPS
✔ 用户管理
✔ 私有仓库
✔ 1 分钟部署
🟢 安装步骤:
-
下载 Windows 版 Gitea:
https://dl.gitea.com/gitea/
运行后程序日志如下,

我们数据库选sqlite就行,注册一个管理员帐号
然后,修改custom\conf\app.ini注意路径在起始的日志里
修改如下内容,
[service]
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = false

然后就可以了,linux推荐用这种 使用 sudo snap install gitea ,然后访问3000端口,配置与windows上一样
gitea v1.25.1 from Gitea installed
(base) user@user-desktop:~$ gitea
2025/11/19 11:40:37 cmd/web.go:266:runWeb() [I] Starting Gitea on PID: 22743
2025/11/19 11:40:37 cmd/web.go:114:showWebStartupMessage() [I] Gitea version: 1.25.1 built with GNU Make 4.3, go1.25.3 : bindata, sqlite, sqlite_unlock_notify, pam, cert
2025/11/19 11:40:37 cmd/web.go:115:showWebStartupMessage() [I] * RunMode: prod
2025/11/19 11:40:37 cmd/web.go:116:showWebStartupMessage() [I] * AppPath: /snap/gitea/7667/gitea
2025/11/19 11:40:37 cmd/web.go:117:showWebStartupMessage() [I] * WorkPath: /var/snap/gitea/common
2025/11/19 11:40:37 cmd/web.go:118:showWebStartupMessage() [I] * CustomPath: /var/snap/gitea/common
2025/11/19 11:40:37 cmd/web.go:119:showWebStartupMessage() [I] * ConfigFile: /var/snap/gitea/common/conf/app.ini
2025/11/19 11:40:37 cmd/web.go:120:showWebStartupMessage() [I] Prepare to run install page
2025/11/19 11:40:39 cmd/web.go:328:listen() [I] Listen: http://0.0.0.0:3000
2025/11/19 11:40:39 cmd/web.go:332:listen() [I] AppURL(ROOT_URL): http://localhost:3000/
2025/11/19 11:40:39 modules/graceful/server.go:50:NewServer() [I] Starting new Web server: tcp:0.0.0.0:3000 on PID: 22743
2025/11/19 11:40:39 modules/graceful/server.go:76:(*Server).ListenAndServe() [E] Unable to GetListener: listen tcp 0.0.0.0:3000: bind: address already in use
2025/11/19 11:40:39 cmd/web.go:377:listen() [E] Failed to start server: listen tcp 0.0.0.0:3000: bind: address already in use
2025/11/19 11:40:39 cmd/web.go:379:listen() [I] HTTP Listener: 0.0.0.0:3000 Closed
2025/11/19 11:40:39 cmd/web.go:152:serveInstall() [E] Unable to open listener for installer. Is Gitea already running?
2025/11/19 11:40:39 modules/graceful/manager.go:176:(*Manager).doHammerTime() [W] Setting Hammer condition
2025/11/19 11:40:40 modules/graceful/manager.go:192:(*Manager).doTerminate() [W] Terminating
2025/11/19 11:40:40 .../graceful/manager_unix.go:154:(*Manager).handleSignals() [W] PID: 22743. Background context for manager closed - context canceled - Shutting down...
2025/11/19 11:40:40 cmd/web.go:158:serveInstall() [I] PID: 22743 Gitea Web Finished
Command error: listen tcp 0.0.0.0:3000: bind: address already in use
在 Ubuntu 使用 snap 安装 gitea 时,配置文件 app.ini 并不在传统的 /etc/gitea/ 或 /var/lib/gitea/,而是被 snap 放在自己的隔离目录中。
下面给你最准确的 snap 版 gitea 配置文件路径:
✅ snap 安装的 Gitea:app.ini 路径
/var/snap/gitea/current/custom/conf/app.ini
也可以通过下面命令确认:
sudo ls /var/snap/gitea/current/custom/conf/
如果目录不存在,需要手动创建:
sudo mkdir -p /var/snap/gitea/current/custom/conf
sudo nano /var/snap/gitea/current/custom/conf/app.ini
📌 查看 snap gitea 日志(里面也会提示 custom 目录路径)
sudo journalctl -u snap.gitea.gitea -f
日志开头通常会显示:
Custom path: /var/snap/gitea/current/custom
Config file: /var/snap/gitea/current/custom/conf/app.ini
✨ 修改示例(你的配置)
编辑文件:
sudo nano /var/snap/gitea/current/custom/conf/app.ini
加入:
[service]
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = false
保存后重启服务:
sudo snap restart gitea
snap list gitea
snap services gitea
总结一下,还是用gitea方便
根据你给出的结果:
$ git branch -vv
develop 0367eb4 [origin/develop: behind 1] 修复问题
* master 78a1b76 [origin/master: ahead 536] 增加书签修复,
这里给出了非常明确的信息:
✅ *你当前所在分支:master(前面有 )
* master 78a1b76 [origin/master: ahead 536]
这一行告诉我们 2 个关键点:
① master 正在跟踪(tracking):
origin/master
这说明:
🎯 执行 git push 时的默认推送目标,就是 origin/master
也就是:
ssh://sunyuzhe@xxxx.xxx:29418/cde/pc/compliance
② master 当前比 origin/master “领先 536 个提交”
[origin/master: ahead 536]
说明你有 536 个本地提交没有推到 origin。
📌 所以你的问题答案非常明确:
👉 现在不加任何参数输入:
git push
默认推送到:
✔ origin/master
(gerrit 仓库)
❗ 如果你想推送到 gitea/master 而不是 origin/master
你要明确指定 remote:
git push gitea master
但你之前的 gitea push 提示 “Failed to authenticate”,说明需要:
-
正确账号密码
-
或 token
-
或用 SSH 配置
我可以帮你解决登录问题。
❗ 如果你想以后 master 默认推送到 gitea/master 而不是 origin/master
执行:
git branch --set-upstream-to=gitea/master master
然后以后:
git push
就会推送到:
gitea/master
另外针对一个linux 上的项目上传到gitea上面,使用remote http
git init 之后
在服务器上建立一个项目,比如叫 orangePi6_mobile_detect
然后
git remote set-url origin http://su1.ltd:3000/admin/orangePi6_mobile_detect.git
git push --set-upstream origin master
这时要输入帐号 admin
密码:不是登录的密码,而是token


只能使用一次就不行了
另外别的http登录不了,要改进一下

nano /var/snap/gitea/common/conf/app.ini
[server]
DOMAIN = su1.ltd
HTTP_PORT = 3000
[security]
ENABLE_WEBAUTHN = false
必须重启动gitea
snap restart gitea
更多推荐
所有评论(0)