使用Git自带的SSH协议搭建git服务器

一、服务器端准备

1. 安装Git并创建Git用户

bash

sudo apt update

sudo apt install git -y

sudo adduser git # 按照提示设置密码

2. 配置Git用户的SSH访问

bash

# 切换到git用户

sudo su - git

# 创建.ssh目录并设置权限

mkdir -p ~/.ssh

chmod 700 ~/.ssh

touch ~/.ssh/authorized_keys

chmod 600 ~/.ssh/authorized_keys

3. 创建仓库目录

bash

# 仍在git用户下

mkdir -p ~/repositories

cd ~/repositories

# 创建一个裸仓库(bare repository)

git init --bare myproject.git

# 设置目录权限(确保git用户可以写入)

chmod -R 755 ~/repositories

二、客户端准备

1. 生成SSH密钥(如果还没有)

bash

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 按回车接受默认位置

# 可以设置密钥密码或留空

2. 查看公钥内容

bash

cat ~/.ssh/id_rsa.pub

复制显示的公钥内容(以 `ssh-rsa` 开头)

3. 配置本地Git

bash

git config --global user.name "Your Name"

git config --global user.email "your@email.com"

三、将客户端SSH公钥添加到服务器

方法A:通过ssh-copy-id(推荐)

```bash

# 在客户端执行

ssh-copy-id git@your-server-ip

# 输入git用户的密码

```

方法B:手动添加

```bash

# 在客户端将公钥复制到服务器

ssh git@your-server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub

# 输入git用户的密码

```

方法C:通过ssh直接编辑

```bash

# 登录到服务器

ssh git@your-server-ip

# 在服务器上编辑authorized_keys

echo "你的公钥内容" >> ~/.ssh/authorized_keys

exit

```

四、客户端推送到服务器的完整流程

1. 新建项目并推送

```bash

# 创建本地项目目录

mkdir myproject

cd myproject

# 初始化本地仓库

git init

# 创建文件并提交

echo "# My Project" > README.md

git add README.md

git commit -m "Initial commit"

# 添加远程仓库

git remote add origin git@your-server-ip:repositories/myproject.git

# 推送到服务器

git push -u origin main # 或 master

```

2. 推送现有项目

```bash

cd existing-project

# 初始化(如果还没初始化)

git init

# 添加远程仓库

git remote add origin git@your-server-ip:repositories/myproject.git

# 首次推送(强制推送如果远程仓库不为空)

git push -u origin main --force

# 或

git push -u origin main

```

3. 推送新分支

```bash

# 创建并切换到新分支

git checkout -b feature-branch

# 做一些更改并提交

git add .

git commit -m "Add new feature"

# 推送新分支到服务器

git push -u origin feature-branch

```

五、解决常见推送问题

### 问题1:权限被拒绝

```bash

# 错误:Permission denied (publickey)

# 解决方案:

# 1. 确保SSH密钥已正确添加

# 2. 检查服务器端权限

ssh git@your-server-ip "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

# 3. 在客户端测试SSH连接

ssh -T git@your-server-ip

```

### 问题2:远程仓库不为空

```bash

# 错误:remote contains uncommitted work

# 解决方案:

# 先拉取再推送

git pull origin main --allow-unrelated-histories

git push origin main

# 或者强制推送(慎用)

git push origin main --force

```

### 问题3:推送被拒绝(非快进)

```bash

# 错误:non-fast-forward updates were rejected

# 解决方案:

git pull --rebase origin main

git push origin main

# 或者

git fetch origin

git merge origin/main

git push origin main

```

六、推送后的验证

### 1. 在服务器端检查

```bash

# 登录到服务器

ssh git@your-server-ip

cd repositories/myproject.git

# 查看接收的提交

git log --oneline

# 查看分支

git branch -r

```

### 2. 在另一台客户端克隆验证

```bash

# 在其他机器上

git clone git@your-server-ip:repositories/myproject.git

cd myproject

ls -la # 查看文件

git log --oneline # 查看提交历史

```

七、配置简化SSH连接

### 1. 编辑SSH配置文件(客户端)

```bash

nano ~/.ssh/config

```

添加以下内容:

```config

Host myserver

HostName your-server-ip

User git

IdentityFile ~/.ssh/id_rsa

Port 22

```

### 2. 使用别名推送

```bash

# 添加远程仓库时使用别名

git remote add origin myserver:repositories/myproject.git

# 推送时更简单

git push origin main

```

八、自动化脚本示例

### 服务器端初始化脚本

```bash

#!/bin/bash

# init-git-server.sh

SERVER_IP="your-server-ip"

PROJECT_NAME="$1"

# 在服务器上执行

ssh git@$SERVER_IP "

cd ~/repositories

git init --bare $PROJECT_NAME.git

echo 'Repository $PROJECT_NAME.git created successfully'

"

```

### 客户端一键推送脚本

```bash

#!/bin/bash

# push-to-server.sh

SERVER="git@your-server-ip"

REPO_PATH="repositories/myproject.git"

git add .

git commit -m "$1"

git push SERVER:REPO_PATH main

```

## 注意事项

1. **首次推送**:使用 `-u` 参数设置上游分支,后续只需 `git push`

2. **权限管理**:确保只有授权用户能推送

3. **冲突处理**:推送前先拉取最新代码

4. **备份重要数据**:定期备份服务器端仓库

5. **查看推送状态**:使用 `git status` 和 `git log` 验证推送结果

按照这些步骤,你应该能顺利将客户端代码推送到SSH协议的Git服务器上。

相关推荐
热爱专研AI的学妹2 小时前
【高级教程】联网搜索网页阅读api使用cURL从接口调试到复杂场景实战
服务器·数据库·人工智能·搜索引擎
Macbethad2 小时前
机器学习开发技术报告
大数据
行业探路者2 小时前
PPT生成二维码与网址跳转码及短视频二维码的应用攻略
大数据·人工智能·学习·产品运营·软件工程
码--到成功2 小时前
elasticsearch同时启动两个冲突问题
大数据·elasticsearch·bisheng
天竺鼠不该去劝架2 小时前
2026 金融智能体选型逻辑:懂金融、重合规、能落地
大数据·数据库·人工智能
CodeAmaz2 小时前
Elasticsearch 数据建模详解:nested vs parent-child
elasticsearch·数据扁平·netsted
一个很帅的帅哥2 小时前
部署chat-vue
大数据·git·elasticsearch
玄同7653 小时前
面向对象编程 vs 其他编程范式:LLM 开发该选哪种?
大数据·开发语言·前端·人工智能·python·自然语言处理·知识图谱
初次攀爬者3 小时前
知识库-向量化功能-EXCEL文件向量化
后端·elasticsearch