直接把代码推到自己的 Git 服务器上,核心就三步:服务器端创建裸仓库、本地添加远程地址、执行 push 命令。 整个过程不需要依赖 GitHub 或 GitLab,一台 Linux 服务器加 Git 环境就能搞定,下面把从零搭建到日常使用的完整流程拆开讲,每一步都给出可验证的命令。
怎么上传代码到自己的git服务器上:先分清两种场景
绝大多数人问”怎么上传代码到自己的git服务器上”时,其实有两种完全不同的需求,第一种是你有服务器权限,想从零搭一个 Git 服务端;第二种是你已经拿到了别人给你的 Git 仓库地址(比如公司内网的 GitLab),只是不知道怎么把本地代码推上去,先确认自己属于哪种,后面的操作路径完全不同。
已有 Git 服务端,只需要上传代码
如果公司或团队已经搭好了 Git 服务器,你只需要做本地操作,假设你拿到了一个仓库地址,格式通常是 git@your-server:/srv/git/project.git 或 http://your-server/project.git。
本地已有项目,想推到远端:
cd /path/to/your-project git init git add . git commit -m "初始提交" git remote add origin git@your-server:/srv/git/project.git git push -u origin master
本地没有项目,想克隆远端代码到本地再修改:
git clone git@your-server:/srv/git/project.git cd project # 改代码后 git add . git commit -m "修改了某个功能" git push
这个场景下,最常遇到的坑是第一次 push 被拒绝,提示 remote error: Repository not found 或 Permission denied,前者通常是仓库路径写错了,后者是 SSH 密钥没配对,下文会专门讲 SSH 密钥配置。
从零搭建属于自己的 Git 服务器
这是真正意义上的”自己的服务器”,你需要一台能通过 SSH 连接的 Linux 机器,云服务器或本地虚拟机都行,系统推荐 Ubuntu 或 CentOS,内存 1G 就足够跑纯 Git 服务。
服务器端操作(以 Ubuntu 为例):
# 安装 Git sudo apt update sudo apt install git -y # 创建专用用户(安全考虑,别用 root 跑 Git) sudo adduser git # 创建裸仓库目录 sudo mkdir -p /srv/git sudo chown git:git /srv/git
然后切换到 git 用户,创建项目裸仓库:
sudo su - git cd /srv/git git init --bare myproject.git
注意 --bare 参数,这是关键。 裸仓库没有工作目录,只保留版本历史,专门用于接收 push,用普通 git init 创建的仓库在接收 push 时会报错。
git服务器搭建全流程:SSH 密钥配置是上传成功的分水岭
很多人在 git 服务器搭建全流程中卡在认证环节,Git 服务器支持 HTTP 和 SSH 两种协议,个人使用强烈推荐 SSH,原因很简单:HTTP 每次 push 都要输账号密码,SSH 配好密钥后一劳永逸。
客户端生成 SSH 密钥:
ssh-keygen -t rsa -b 4096 -C "你的邮箱"
一路回车生成默认密钥对,然后查看公钥:
cat ~/.ssh/id_rsa.pub
服务器端添加公钥:
# 在服务器上,切到 git 用户 sudo su - git mkdir -p ~/.ssh chmod 700 ~/.ssh echo "你刚才复制的公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
这里有个细节容易忽略:.ssh 目录权限必须是 700,authorized_keys 文件权限必须是 600,权限不对的话,SSH 会直接拒绝认证,哪怕公钥内容完全正确。
测试 SSH 连接:
ssh git@你的服务器IP
如果看到欢迎信息或直接退出(没有提示输入密码),说明密钥配置成功,如果提示 Permission denied (publickey),优先检查权限设置,其次确认公钥有没有粘贴完整。
行业共识认为,SSH 密钥认证是自建 Git 服务器最安全的认证方式,因为私钥永不离开本地机器,据不完全统计,绝大多数 Git 服务器安全问题都出在密码认证方式上。
本地代码推送到远程仓库的完整操作路径
SSH 配置好后,核心上传命令就变得非常简单,以刚才创建的 myproject.git 为例:
cd /path/to/your-project git init git add . git commit -m "首次提交" git remote add origin git@你的服务器IP:/srv/git/myproject.git git push -u origin master
-u 参数会把本地 master 分支和远程 master 分支建立关联,之后直接敲 git push 就行了,这个命令组合就是”怎么上传代码到自己的git服务器上”的标准答案,百分之九十的日常操作都离不开这几条。
分支操作注意事项:
- 如果项目默认分支是
main而不是master,把上面命令里的master全换成main - 首次 push 想同时推送所有分支,用
git push -u origin --all - 推送标签用
git push --tags,标签不会跟随普通 push 自动上传
常见报错及排查方向:
error: failed to push some refs本地和远程提交历史冲突,先git pull再 pushfatal: 'repository' does not appear to be a git repository远程地址路径写错了,检查 IP、目录名、.git后缀Connection refused服务器防火墙没放行 SSH 端口(默认 22),或者 SSH 服务没启动
如何在服务器上管理多个仓库和用户权限
自建 Git 服务器用久了,仓库会多起来,这里提供一个简单但正规的目录组织方式:
/srv/git/
├── personal/ # 个人项目
├── work/ # 工作项目
└── experiments/ # 实验项目
按目录区分项目类型,每个目录下用 git init --bare 创建裸仓库。
mkdir -p /srv/git/work cd /srv/git/work git init --bare data-analysis.git
多用户权限管理思路:
如果只有你自己一个人用,上面 SSH 密钥方案完全够用,如果几个人一起用,需要给每个人的公钥都加到 authorized_keys 文件里,但这样做所有人权限相同,都能删仓库、强制 push。
团队协作场景下,更好的方案是安装 Gitolite 或 Gitea,Gitolite 是一个轻量级权限管理工具,可以精确控制每个人对每个仓库的读写权限,Gitea 则是带 Web 界面的 Git 服务(类似内网版 GitHub),部署也不复杂,下载二进制文件直接运行即可,业内专家指出,对于五人以下的小型团队,Gitolite 足够用;超过十个人,建议上 Gitea,管理成本会低很多。
你的 git 服务器日常维护:备份和数据抢救
代码是数字资产,自建 Git 服务器必须做备份,备份方案比想象中简单裸仓库本质就是文件夹,直接打包复制就行。
手动备份裸仓库:
# 服务器上执行 cd /srv/git tar -czf myproject_backup.tar.gz myproject.git # 用 scp 拉到本地 scp git@你的服务器IP:/srv/git/myproject_backup.tar.gz ~/backup/
自动备份方案:
用 crontab 定时执行备份脚本,保留最近 7 份:
# 备份脚本 backup_git.sh #!/bin/bash BACKUP_DIR="/home/git/backup" DATE=$(date +%Y%m%d) mkdir -p $BACKUP_DIR tar -czf $BACKUP_DIR/git_backup_$DATE.tar.gz /srv/git/ find $BACKUP_DIR -name ".tar.gz" -mtime +7 -delete
然后加入 crontab:
crontab -e # 每天凌晨两点执行 0 2 /home/git/backup_git.sh
恢复备份:
# 服务器上执行 tar -xzf git_backup_20260601.tar.gz -C /tmp/ # 解压后是 srv/git/ 目录结构,把里面的裸仓库移回原位
这个备份方案不依赖任何第三方服务,把整个 /srv/git 目录打包就行,相比托管平台的自带备份,自建服务器胜在完全自主可控,备份文件用 tar 或 zip 读取都没有障碍。
关于怎么上传代码到自己的git服务器上的常见疑问
Git 服务器和 GitHub 的主要区别是什么?
GitHub 是托管平台,你的代码仓库放在 GitHub 的服务器上,别人通过公网访问,自建 Git 服务器是把仓库放在自己控制的机器上,数据不出内网,适合代码不能公开的场景,最近几年国内团队比较流行把代码放在自建 GitLab 上,本质也是 Git 服务器,只是多了一层 Web 界面和项目管理功能,自建方案的优势是无用户数限制、存储空间完全由自己控制、数据安全不受第三方平台政策影响。
push 时提示输入密码,可我配了 SSH 密钥为什么还要密码?
两种情况,第一,你 clone 仓库时用的是 HTTP 地址而不是 SSH 地址,检查 git remote -v 输出,如果远程地址是 http:// 开头,换成 git@服务器IP:/srv/git/xxx.git 格式,第二,SSH 密钥没配成功,回到前面 SSH 配置部分重新检查权限和公钥,确认方式很简单,执行 ssh git@你的服务器IP,如果还问密码就是密钥没生效。
怎么删除 git 服务器上的历史提交记录?
这个操作比较危险,思路是用孤儿分支重建历史,在本地执行 git checkout --orphan new_branch 重新提交代码,再强制推送到服务器,操作完成后旧提交在本地仍然能通过 git reflog 找回,但在服务器上已经不可访问,强烈建议在操作前先做一次完整备份,避免不可逆的数据丢失。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/717890.html





