Git服务器搭建笔记

前言:最近公司要使用git服务器对Android4.4的源码进行版本控制,所以花了些时间在Ubuntu14.04上搭建了git服务器,正好前段时间也学习了下git的使用哈哈

 ------------------------------------------------------------------------

 平台:Ubuntu14.04

 ------------------------------------------------------------------------

1.首先在服务器上需要下载一些软件

sudo apt-get install git-core python-setuptools openssh-server openssh-client

 

2.新建一个git用户,当我们再服务器上管理git版本库的时候只允许使用git用户(root用户当然除外)

sudo useradd -m git 
sudo passwd git

 

3.安装Gitosis软件,该软件用来管理团队成员对远程仓库的访问权限等

git clone https://github.com/res0nat0r/gitosis.git 
cd gitosis/ 
sudo python setup.py install

  注意github网址那是2个数字0呢,不是大写的字母o

 

4.选择一台计算机作为服务器管理员远程管理服务器,所以这一步应该在管理员的计算机上操作

  4.1.安装git客户端

sudo apt-get install git

  4.2.生成ssh密钥

ssh-keygen -t rsa

  4.3.使用ssh把生成的密钥推送到服务器上,XXX表示管理员计算机的用户名,serverIP表示服务器的IP地址,也就是推送到/tmp/目录下

scp /home/XXX/.ssh/id_rsa.pub git@serverIP:/tmp

 

5.切换到服务器上,把刚刚推送过来的秘钥生效,

  注意:在执行这条命令之前请确保/home/git/下没有.ssh文件夹,若有请手动删除,因为在执行gitosis-init命令时会在/home/git目录下创建一个.ssh目录,同时在.ssh目录下创建authorized_keys文件,并且将id_rsa.pub这个密钥写入authorized_keys这个文件中,这样该密钥的拥有者就对gitosis-admin.git这个仓库具有访问权限.

sudo -H -u git gitosis-init < /tmp/id_rsa.pub

  执行这条命令后会打印如下log:

Initialized empty Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/

  由log我们可以看到已经自动生成了一个gitosis-admin的仓库,同时以后git的默认仓库路径都在/home/git/repositories/下

 

6.需要对其中的一个post-update文件添加可执行的权限

sudo chmod 755 /home/gitrepository/gitosis-admin.git/hooks/post-update 

 

  好啦,到这为止,服务器已经搭建好啦,但是现在貌似只有管理员的计算机能访问git服务器上的仓库哦,因为现在服务器上只有管理员的ssh秘钥呢,所以接下来继续配置团队中其他成员的访问权限

  这里就需要gitosis上场啦,gitosis就是用来管理authorized_keys文件和简单连接限制的脚本。添加、删除用户或设定权限这些工作是通过管理一个特殊的git仓库来实现的,你只需要在这个仓库做好相应的设置,然后推送到服务器上,gitosis就会随之改变策略,而这个特殊的git仓库就是刚刚生成的gitosis-admin.git啦

  既然服务器上的环境已经搭建好了,那么之后的步骤就不需要在服务器上操作啦,切换到管理员的计算机上进行第6步

 

7.克隆git特殊仓库到管理员计算机上,同样serverIP还是服务器IP地址

git clone git@serverIP:gitosis-admin.git

  执行这条语句会得到一个gitosis-admin文件夹,里面包括一个gitosis.conf文件和一个keydir文件夹,gitosis.conf主要是配置用户、仓库和权限的配置文件,而keydir目录中则保存的是用户的密钥,每个用户都得有一个.pub结尾的文件

  我们看下gitosis.conf文件的具体内容

$ cat gitosis.conf
[gitosis]

[group gitosis-admin]
members = scott
writable = gitosis-admin

  我们可以这么理解,对于一个gitosis-admin组中,成员scott对gitosis-admin仓库有读写权限,这也就是我们管理员的用户名以及对gitosis-admin仓库的管理权限

 

8.在服务器上增加一个git仓库,同时配置成员属性

  当我们需要添加一个新git项目,由于gitosis-admin仓库只有管理员具有读写权限,所以只有管理员才有权限去增加git仓库或者管理项目成员

  这里假设需要新建一个test仓库,同时需要增加john,jet成员一起进行版本控制,需要如下几步

  8.1.拿到john与jet的ssh密钥,密钥的生成请参考4.1与4.2,管理员把密钥文件分别命名为john.pub与jet.pub,cp到gitosis-admin/keydir目录下

  8.2.更改gitosis.conf文件:

[gitosis]

[group gitosis-admin]
members = scott
writable = gitosis-admin

[group team]
members = scott john jet
writable = test

  注意:这里members指定的用户名必须同".pub"前面的命名相同,例如,如果是scott.pub,那么这里写上scott就可以了,通常,我们生成密钥时会跟上机器的名字,如果你的.pub命名带上"@机器名"的话,那么members这里也要带上@机器名,总之members指定的名字一定要同".pub"前面命名相同。

  既然是权限控制,那么肯定有只读的权限啦

[group testread]
members = xiaoming
readonly = test

  8.3.提交到远程服务器上

git init
git add . git commit
-m "yourLog" git push origin master

  如此,就完成了新仓库的创建与用户的配置,如果在Log中需要换行,commit更改为如下指令即可

git commit -m '
1.aaa
2.bbb
'

 

  这里还有一个问题,在配置的这些用户中都有权限去创建test仓库,所以只需要一人去push就行啦,其他用户可以直接clone代码到本地库,不然会引起冲突的哦

 

  说明:当我们在gitosis.conf文件中声明了仓库名,所以我们不需要在服务器上新建一个仓库了,因为当我们第一次提交文件到服务器上的时候会自动新建仓库的。

 

 ---------------------------------------------------------------<完>------------------------------------------------------------------------

 

补充:如果我们要提交一个很大的项目,比如Android4.4等系统源码,使用远程push很费时间,还要依赖网络,时时担心网络会不会掉线等

 一、所以我们可以在服务器上直接提交代码

  1.在服务器上安装git客户端

  2.生成密钥,并且把密钥push到服务器上(这里为什么不直接复制?因为在版本库里是找不到密钥文件的,可能是由于安全原因吧)

  3.在项目文件夹中执行以下命令

git init
git remote add origin git@127.0.0.1:yourGitProject.git
git add .
git commit -m "yourLog"
git push origin master

  像这样很耗时的操作建议自己编写sh脚本让其自动执行,然后我们就可以去干别的事啦

 

 二、git客户端用户信息配置请使用

git config --global user.name "yourname"
git config --global user.email "youremail"

 

 三、还有一种办法可以更改git仓库,不需要让管理员添加密钥

  比如仓库里有一个test.git,同时我们知道服务器上git用户的密码,那么嘿嘿嘿嘿

git clone git@serverIP:/home/git/repositories/test.git

  对了!使用绝对路径,一般来说,git上的仓库都在默认的/home/git/repositories目录下

  如果提示以下错误

Cloning into 'test'...

ERROR:gitosis.serve.main:Repository read access denied
fatal: The remote end hung up unexpectedly

  那么我们加上sudo继续执行上述命令即可

sudo git clone git@serverIP:/home/git/repositories/test.git

  接下来会提示你输入git用户的登录密码,当我们输入密码之后,嘿嘿嘿,这个仓库就clone下来了,同样也是可以push的哦,但是每次都需要输入git用户的密码,当然gitosis-admin仓库也可以哦

  

  此方法在我的机器上能实现,不知道大家的能不能实现,当时我还在纠结我明明配置了访问git仓库的用户权限,为何每个用户都能访问了,后来在正确配置密钥然后再clone的时候发现不需要填写git用户的密码了,所以想是不是git用户的密码的原因,因为我已经连接上git了呀,或者就是我服务器没有配置好的原因了,若有大神指导,还请指导一二,不胜感激!!

  对了,我的/etc/passwd文件末尾,是没有/bin/sh属性的,如下所示

git:x:1000:1000::/home/git:

 

最后补充一个大插曲

由于源码是拿到原厂的源码,而且不是个纯净版本,里面有几百个.git目录与几百个.gitignore文件,由于第一次传git,没有经验,所以没有对这些文件进行处理,就直接往服务器上传了,45w个文件,还好是局域网,10GB半个小时传完了,然后另外一台电脑clone下来,编译,我去,提示缺少文件,然后我就进入了一边编译看缺少哪些文件一边改.gitignore文件,然后push到服务器中,另一台再pull下来,继续编译,就这么折腾了差不多一天,实在受不了了,这简直是个无底洞阿,还不知道要弄到什么时候去,原厂在开发的时候应该是首先拿着纯净的源码,然后一边开发一边写.gitignore文件(因为如果把编译过程中生成的二进制文件也传到服务器中,这对服务器也是个不小的挑战)最后release给我们的源码却没有删掉.gitignore,这怎么办呢?一个一个改?我去好几百文件呢,突然想到不是还有回收站吗,于是,我就把所有的.gitigore文件全部放到回收站里哈哈,然后把剩下的所有源码push到服务器中,接着再从回收站里恢复所有的.gitignore文件,再把这些.gitignore文件加到版本库里push到服务器中,搞定!真是机智

 

------20170208  update-------------------------------------------------------------------------

问题描述:我在A电脑上更改了compile.sh文件,然后push到远程,然后在B电脑上使用fetch下载刚刚改动的文件,(由于B电脑上工作区改动了很多文件,而我害怕被覆盖,所以使用了fetch而不是pull),然后再使用git checkout [commit] compile.sh更新暂存区与工作区的文件,那么,问题来了:这么做的后果是,当我使用git log的时候无法显示在电脑A上的提交,使用git blame compile.sh命令包含如下信息:

00000000 (Not Committed Yet 2017-02-08 14:16:09 +0800  73)      source build/envsetup.sh
00000000 (Not Committed Yet 2017-02-08 14:16:09 +0800  74)      lunch aosp_avocado-userdebug

 这是由于没有合并导致的,可以先使用git log -p master..origin/master查看本地与远程的区别,然后再使用git merge origin/master来合并代码,当然也可以使用pull来实现,只是这么做不太安全,因为不知道到底会合并了哪些文件。

 

posted @ 2017-01-16 22:06  某某璀  阅读(710)  评论(0编辑  收藏  举报
levels of contents