在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。
GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。
搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt
命令就可以完成安装。
假设你已经有sudo
权限的用户账号,下面,正式开始安装。
第一步,安装git
:
$ sudo apt-get install git
第二步,创建一个git
用户,用来运行git
服务:
$ sudo adduser git
第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub
文件,把所有公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是/srv/sample.git
,在/srv
目录下输入命令:
$ sudo git init --bare sample.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git
结尾。然后,把owner改为git
:
$ sudo chown -R git:git sample.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd
文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git
用户可以正常通过ssh使用git,但无法登录shell,因为我们为git
用户指定的git-shell
每次一登录就自动退出。
第六步,克隆远程仓库:
现在,可以通过git clone
命令克隆远程仓库了,在各自的电脑上运行:
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.
剩下的推送就简单了。
管理公钥
如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys
文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。
这里我们不介绍怎么玩Gitosis了,几百号人的团队基本都在500强了,相信找个高水平的Linux管理员问题不大。
管理权限
有很多不但视源代码如生命,而且视员工为窃贼的公司,会在版本控制系统里设置一套完善的权限控制,每个人是否有读写权限会精确到每个分支甚至每个目录下。因为Git是为Linux源代码托管而开发的,所以Git也继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以,可以在服务器端编写一系列脚本来控制提交等操作,达到权限控制的目的。Gitolite就是这个工具。
这里我们也不介绍Gitolite了,不要把有限的生命浪费到权限斗争中。
小结
您的支持是作者写作最大的动力!
教程没看明白?
请在问答区提问,贴上代码和出错信息:
@Evin20
@廖雪峰
我遇到的问题和楼上一摸一样,请问如何解决呢?公钥和权限都是给对了的。
您好,我在我的博客转载了您的这篇文章<a href="http://donghongfei.com/p323.html">http://donghongfei.com/p323.html</a>
Gerrit和git一起用也挺不错的,廖老师也可以介绍介绍 应该有很多人可以学习并应用 呵呵
廖老师 ,你好!请问第六步的git clone git@server:/srv/sample.git
中的server 指的是git服务器的ip地址吗?能详细说明下吗?谢谢啦!
git不使用远程仓库,没办法团队合作修改代码吧,怎么感觉比svn也没多少优势啊。另外windows平台能实现git仓库搭建吗
@廖雪峰
我没改passwd文件, 不管是在git服务器上还是在远程机器上, 都提要示要密码...
啥原因呢
@石峰Away
我没改passwd文件, 不管是在git服务器上还是在远程机器上, 都提要示要密码...
啥原因呢
@石峰Away
找到问题出现在哪里了,没有去改passwd文件就没有问题
@石峰Away
你的机器是L,远程机器是R,远程用户是git,你的公钥要放到R的/home/git/.ssh/authorized_keys,你的私钥必须在L上<用户主目录>/.ssh/id_rsa。
当前用户公钥已存入authorized_keys文件,然后在远程库的同一台机器上git clone的时候还会提示git@localhost's password:,这个大概会是什么原因
@白宝冰King
你这是典型的linux权限配置问题,google一下chown/chmod
。。。。。。峰哥
git@VM-140-95-ubuntu:/tmp/git1$ git clone git@localhost:/tmp/git/sample.git
fatal: could not create work tree dir 'sample'.: Permission denied
为什么 到这块 没有视频啊 ,峰哥
@白宝冰King
请仔细阅读“远程仓库”一节
马上就ok了,卡这了,峰哥
峰哥 ,第三步真心不明白,恳请峰哥,答复。。。
@sunyang的一天
普通用户是无法创建用户的,
$ sudo useradd git 这里切换到管理员,使用管理员权限创建git用户。
如果是#号提示符,表示是root身份,因此就不需要了sudo了
# useradd git
@周梦康
要注意git操作远程服务器的用户是git,确保owner:group都显示git:git,仓库目录也必须是git:git
我是参考的 https://help.github.com/articles/generating-ssh-keys 生成的key,添加到github上,测试,正常连接。
但是我把这个公钥复制到自己的服务器的/home/git/.ssh/authorized_keys就怎么也连接不上,目前.ssh目录权限是 600 ,authorized_keys文件权限也是 600
一直提示有没有权限,仓库是否存在,我能ssh远程连接 22 端口也应该是开了的。
我按照这个步骤怎么第六步连不上呢 是前五步完成以后直接用另外的机子进行第六步吗 只要把公钥导进去就可以了嘛 是我自己哪里弄错了吗
@sunyang的一天
Linux下,假定你不是root用户,需要sudo,如果是root,不需要,但是没事用root登陆不好。有的linux版本用adduser,有的用useradd,有的两个都支持。
@LoNeJun
没有authorized_keys先创建,然后把每个用户的id_ras.pub的内容加进去,一个用户的key是一行
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
以上这个步骤,请问 服务器上没有/home/git/.ssh/authorized_keys 文件,是手动创建吗?
一行一个 请问是将客户端id_rsa.pub 的内容 添加到 /home/git/.ssh/authorized_keys中?
Hi,你的第二步,创建一个git用户,用来运行git服务:$ sudo adduser git
命令是不是错了?
应该是::$ useradd git
没有智能手机的怎么“小额赞助”呢?
建议po主留个收款账号啊。
写的不错,对我有帮助。
非常感谢牛人的分享,之前一直关注git但是都不知道怎么找到学习的入口,终于在您这里学习并实践了,对比他人汗颜本人速度慢,看加实践加笔记用了好几天
好作品....花了一下午搞了一遍,真心感谢!!真正高手不经自己理解透彻,还能很清楚讲给菜鸟听!!膜拜中...
带着练习看完了。真是大作,通俗易懂。又了解了原理,还会操作了。
一口气看完了,很不错!
一看就懂,赞