使用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服务器上。

相关推荐
2501_9272835819 小时前
堆垛机立体库:告别人工翻找与货物堆压
大数据·人工智能·低代码·自动化·区块链
蚁小二官方19 小时前
自媒体算法获流逻辑:通过受众定位与内容迭代,沉淀精准垂直流量
大数据·产品运营
xzzd_jokelin19 小时前
AI编程,几个核心工件写成了可直接使用的文件
大数据·人工智能·elasticsearch·ai编程·codex
搞科研的小刘选手19 小时前
【大数据方向专题研讨会】第三届大数据与数字化管理国际学术会议(ICBDDM 2026)
大数据·信息安全·数据挖掘·云计算·可视化·供应链·信息管理
2601_9594779119 小时前
Vatee平台平台运行稳定吗?
大数据·人工智能·安全
明夜之约20 小时前
Elasticsearch 深度解析:从倒排索引原理到亿级数据生产实战
大数据·elasticsearch·搜索引擎
garmin Chen20 小时前
Elasticsearch(1):Elasticsearch核心原理与基础操作总结
java·大数据·笔记·elasticsearch·搜索引擎·全文检索
humors22120 小时前
聊聊密码为啥会“白设”
大数据·运维·服务器·网络·网络安全
Sharewinfo_BJ20 小时前
Power BI 5月重磅更新:8大新功能全面提升数据分析效率
大数据·人工智能·数据分析
中电金信20 小时前
中电金信分布式核心系统与鲲鹏实现“原生开发”,共筑数智金融新范式
大数据·人工智能