[#ch04-git-server]
== 服务器上的 Git

(((serving repositories)))
到目前为止，你应该已经有办法使用 Git 来完成日常工作。
然而，为了使用 Git 协作功能，你还需要有远程的 Git 仓库。
尽管在技术上你可以从个人仓库进行推送（push）和拉取（pull）来修改内容，但不鼓励使用这种方法，因为一不留心就很容易弄混其他人的进度。
此外，你希望你的合作者们即使在你的电脑未联机时亦能存取仓库 — 拥有一个更可靠的公用仓库十分有用。
因此，与他人合作的最佳方法即是建立一个你与合作者们都有权利访问，且可从那里推送和拉取资料的共用仓库。

架设一台 Git 服务器并不难。
首先，选择你希望服务器使用的通讯协议。
在本章第一节将介绍可用的协议以及各自优缺点。
下面一节将解释使用那些协议的典型设置及如何在你的服务器上运行。
最后，如果你不介意托管你的代码在其他人的服务器，且不想经历设置与维护自己服务器的麻烦，可以试试我们介绍的几个仓库托管服务。

如果你对架设自己的服务器没兴趣，可以跳到本章最后一节去看看如何申请一个代码托管服务的帐户然后继续下一章，我们会在那里讨论分散式源码控制环境的林林总总。

一个远程仓库通常只是一个裸仓库（_bare repository_）— 即一个没有当前工作目录的仓库。
因为该仓库仅仅作为合作媒介，不需要从磁碟检查快照；存放的只有 Git 的资料。
简单的说，裸仓库就是你工程目录内的 `.git` 子目录内容，不包含其他资料。

include::book/04-git-server/sections/protocols.asc[]

include::book/04-git-server/sections/git-on-a-server.asc[]

include::book/04-git-server/sections/generating-ssh-key.asc[]

include::book/04-git-server/sections/setting-up-server.asc[]

include::book/04-git-server/sections/git-daemon.asc[]

include::book/04-git-server/sections/smart-http.asc[]

include::book/04-git-server/sections/gitweb.asc[]

include::book/04-git-server/sections/gitlab.asc[]

include::book/04-git-server/sections/hosted.asc[]

=== 总结

你有多种远程存取 Git 仓库的选择便于与其他人合作或是分享你的工作。

运行你自己的服务器将有许多权限且允许你运行该服务于你自己的防火墙内，但如此通常需要耗费你大量的时间去设置与维护服务器。
如果你放置你的资料于托管服务器内，可轻易的设置与维护；无论如何，你必须能够保存你的代码在其他服务器，且某些组织不允许此作法。
这将直接了当的决定哪个作法或组合的方式较适合你或你的组织。
