# 配置服務器
我們來看看如何配置服務器端的 SSH 訪問。本例中,我們將使用 `authorized_keys` 方法來對用戶進行認證。同時我們假設你使用的操作系統是標準的 Linux 發行版,比如 Ubuntu。首先,創建一個操作系統用戶 `git`,并為其建立一個 `.ssh` 目錄。
~~~
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
~~~
接著,我們需要為系統用戶 `git` 的 `authorized_keys` 文件添加一些開發者 SSH 公鑰。假設我們已經獲得了若干受信任的公鑰,并將它們保存在臨時文件中。與前文類似,這些公鑰看起來是這樣的:
~~~
$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
~~~
將這些公鑰加入系統用戶 `git` 的 `.ssh` 目錄下 `authorized_keys` 文件的末尾:
~~~
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys
~~~
現在我們來為開發者新建一個空倉庫。可以借助帶 `--bare` 選項的 `git init` 命令來做到這一點,該命令在初始化倉庫時不會創建工作目錄:
~~~
$ cd /opt/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /opt/git/project.git/
~~~
接著,John、Josie 或者 Jessica 中的任意一人可以將他們項目的最初版本推送到這個倉庫中,他只需將此倉庫設置為項目的遠程倉庫并向其推送分支。請注意,每添加一個新項目,都需要有人登錄服務器取得 shell,并創建一個裸倉庫。我們假定這個設置了 `git` 用戶和 Git 倉庫的服務器使用 `gitserver` 作為主機名。同時,假設該服務器運行在內網,并且你已在 DNS 配置中將 `gitserver` 指向此服務器。那么我們可以運行如下命令(假定 `myproject` 是已有項目且其中已包含文件):
~~~
# on John's computer
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/opt/git/project.git
$ git push origin master
~~~
此時,其他開發者可以克隆此倉庫,并推回各自的改動,步驟很簡單:
~~~
$ git clone git@gitserver:/opt/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master
~~~
通過這種方法,你可以快速搭建一個具有讀寫權限、面向多個開發者的 Git 服務器。
需要注意的是,目前所有(獲得授權的)開發者用戶都能以系統用戶 `git` 的身份登錄服務器從而獲得一個普通 shell。如果你想對此加以限制,則需要修改 `passwd` 文件中(`git` 用戶所對應)的 shell 值。
借助一個名為 `git-shell` 的受限 shell 工具,你可以方便地將用戶 `git` 的活動限制在與 Git 相關的范圍內。該工具隨 Git 軟件包一同提供。如果將 `git-shell` 設置為用戶 `git` 的登錄 shell(login shell),那么用戶 `git` 便不能獲得此服務器的普通 shell 訪問權限。若要使用 `git-shell`,需要用它替換掉 bash 或 csh,使其成為系統用戶的登錄 shell。為進行上述操作,首先你必須確保 `git-shell` 已存在于 `/etc/shells` 文件中:
~~~
$ cat /etc/shells # see if `git-shell` is already in there. If not...
$ which git-shell # make sure git-shell is installed on your system.
$ sudo vim /etc/shells # and add the path to git-shell from last command
~~~
現在你可以使用 `chsh <username>` 命令修改任一系統用戶的 shell:
~~~
$ sudo chsh git # and enter the path to git-shell, usually: /usr/bin/git-shell
~~~
這樣,用戶 `git` 就只能利用 SSH 連接對 Git 倉庫進行推送和拉取操作,而不能登錄機器并取得普通 shell。如果試圖登錄,你會發現嘗試被拒絕,像這樣:
~~~
$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.
~~~
現在,網絡相關的 Git 命令依然能夠正常工作,但是開發者用戶已經無法得到一個普通 shell 了。正如輸出信息所提示的,你也可以在 `git` 用戶的家目錄下建立一個目錄,來對 `git-shell` 命令進行一定程度的自定義。比如,你可以限制掉某些本應被服務器接受的 Git 命令,或者對剛才的 SSH 拒絕登錄信息進行自定義,這樣,當有開發者用戶以類似方式嘗試登錄時,便會看到你的信息。要了解更多有關自定義 shell 的信息,請運行 `git help shell`。
- 前言
- Scott Chacon 序
- Ben Straub 序
- 獻辭
- 貢獻者
- 引言
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 命令行
- 1.5 安裝 Git
- 1.6 初次運行 Git 前的配置
- 1.7 獲取幫助
- 1.8 總結
- 2. Git 基礎
- 2.1 獲取 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 Git 別名
- 2.8 總結
- 3. Git 分支
- 3.1 分支簡介
- 3.2 分支的新建與合并
- 3.3 分支管理
- 3.4 分支開發工作流
- 3.5 遠程分支
- 3.6 變基
- 3.7 總結
- 4. 服務器上的 Git
- 4.1 協議
- 4.2 在服務器上搭建 Git
- 4.3 生成 SSH 公鑰
- 4.4 配置服務器
- 4.5 Git 守護進程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的選擇
- 4.10 總結
- 5. 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一個項目貢獻
- 5.3 維護項目
- 5.4 總結
- 6. GitHub
- 6.1 賬戶的創建和配置
- 6.2 對項目做出貢獻
- 6.3 維護項目
- 6.4 管理組織
- 6.5 腳本 GitHub
- 6.6 總結
- 7. Git 工具
- 7.1 選擇修訂版本
- 7.2 交互式暫存
- 7.3 儲藏與清理
- 7.4 簽署工作
- 7.5 搜索
- 7.6 重寫歷史
- 7.7 重置揭密
- 7.8 高級合并
- 7.9 Rerere
- 7.10 使用 Git 調試
- 7.11 子模塊
- 7.12 打包
- 7.13 替換
- 7.14 憑證存儲
- 7.15 總結
- 8. 自定義 Git
- 8.1 配置 Git
- 8.2 Git 屬性
- 8.3 Git 鉤子
- 8.4 使用強制策略的一個例子
- 8.5 總結
- 9. Git 與其他系統
- 9.1 作為客戶端的 Git
- 9.2 遷移到 Git
- 9.3 總結
- 10. Git 內部原理
- 10.1 底層命令和高層命令
- 10.2 Git 對象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用規格
- 10.6 傳輸協議
- 10.7 維護與數據恢復
- 10.8 環境變量
- 10.9 總結
- A. 其它環境中的 Git
- A1.1 圖形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Eclipse 中的 Git
- A1.4 Bash 中的 Git
- A1.5 Zsh 中的 Git
- A1.6 Powershell 中的 Git
- A1.7 總結
- B. 將 Git 嵌入你的應用
- A2.1 命令行 Git 方式
- A2.2 Libgit2
- A2.3 JGit
- C. Git 命令
- A3.1 設置與配置
- A3.2 獲取與創建項目
- A3.3 快照基礎
- A3.4 分支與合并
- A3.5 項目分享與更新
- A3.6 檢查與比較
- A3.7 調試
- A3.8 補丁
- A3.9 郵件
- A3.10 外部系統
- A3.11 管理
- A3.12 底層命令