慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
最簡單的 Git 服務器
阮一峰 · 2022-10-23 · via 阮一峰的网络日志

程序員的代碼倉庫,總是需要託管一份在服務器,這樣才保險,也方便使用。

今天就來談談 Git 服務器。

一、代碼託管服務

一般情況下,都不建議自己搭建 Git 服務器,而要使用現成的服務,也就是代碼託管服務。它們都是免費的。

其中,除了最後一家 Gitee 是國內的服務,其他都是國外的服務。

這些外部服務,就不多做介紹了。本文的重點不是它們,而是想談如果不得不自己搭建 Git 服務器,那該怎麼做。

二、Git 服務器軟件

自己搭建 Git 服務器的原因,無非就是不方便訪問外網,不願意代碼放在別人的服務器,或者有一些定製化的需求。

這時,你可以選擇開源的 Git 服務器軟件。

這些軟件裡面,Gogs 的安裝是最簡單的,但是功能相對比較弱。功能越強的軟件,安裝越複雜。

如果你只是想遠程保存一份代碼,並不在意有沒有 Web 界面,或者其他功能,那麼根本不用安裝上面這些軟件,一行命令就夠了。

三、Git 倉庫的 SSH 傳輸

熟悉 Git 的同學可能知道,Git 默認支持兩種傳輸協議:SSH 和 HTTP/HTTPS。

服務器一般都自帶 SSH,這意味著,我們可以什麼都不安裝,只通過 SSH 就把倉庫推到遠程服務器。

所以,一條命令就夠了。我們只要在遠程服務器上,建立同名的 Git 倉庫,服務器就搭建好了。


$ git init --bare [倉庫名].git

上面命令中,各個部分的含義如下。

(1)git init:初始化一個 Git 倉庫。

(2)--bare:表示新倉庫不需要工作目錄,只建立 Git 數據目錄。

(3)[倉庫名].git:指定倉庫名,比如倉庫名是example,那麼就要建立一個叫做example.git的 Git 數據目錄。

執行這條命令以後,一個最簡易的 Git 服務器就誕生了。後面,我們就可以通過 SSH 連接,把本地代碼推送到這個遠程 Git 倉庫了。

四、操作演示

下面,我演示一下整個操作過程。

操作分成兩部分,先在遠程服務器操作,然後在本地計算機操作。

4.1 遠程服務器操作

下面的操作都在遠程服務器完成,假設你已經通過 SSH 登錄上去了。不熟悉 SSH 的同學可以看參考這篇《SSH 入門》

登錄遠程服務器的目的,主要是新建一個專門的用戶,所有的 Git 操作都通過該用戶完成。這一步其實不是必需的,但是這樣後期操作比較靈活(比如倉庫可以讓多人共享)。


$ sudo mkdir /home/git
$ sudo useradd git
$ sudo mkdir -m 700 /home/git/.ssh
$ sudo cp ~/.ssh/authorized_keys /home/git/.ssh/

上面命令的含義如下。

(1)新建新用戶的主目錄/home/git

(2)新建一個用戶,用戶名為git

(3)新建新用戶的 SSH 目錄/home/git/.ssh

(4)把當前用戶的公鑰拷貝給git用戶,以便密鑰登陸,詳細解釋可以參考《SSH 密鑰登錄》

如果你只用密碼登錄,不使用密鑰登錄,那麼上面第三步和第四步是不需要的,但是需要為git用戶設定密碼,命令如下。


$ sudo passwd git

4.2 本機計算機操作

後面的操作都在本地計算機完成。

假定上一小節的遠程服務器的 IP 地址是192.168.1.25,本地的 Git 倉庫名為example


$ ssh [email protected] git init --bare example.git

上面命令中,ssh [email protected]表示以git用戶的身份,登錄到遠程服務器。後面的部分是 SSH 的一種語法,表示登錄後在遠程服務器執行的命令,即新建一個遠程 Git 數據目錄example.git

這條命令運行完,就有了一個 Git 服務器了,然後就可以推送代碼了。


$ cd example
$ git remote add myServer [email protected]:example.git
$ git push myServer master

上面的命令先進入本地倉庫,為遠程服務器加一個別名,然後把代碼推送過去。

五、另一種操作方法

上面的例子使用git init --bare命令,在遠程服務器新建 Git 數據目錄。其實,Git 數據目錄就是一個普通目錄,直接從本地計算機拷貝過去也可以。


$ scp -r example/.git [email protected]:/home/git/example.git

上面的命令使用scp工具將本地的 example倉庫裡面的.git子目錄,拷貝到遠程服務器的目錄example.git。這樣也能建立 Git 服務器。

六、參考鏈接

(完)