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来实现,只是这么做不太安全,因为不知道到底会合并了哪些文件。
作者:pngcui
博客园:http://www.cnblogs.com/pngcui/
github:https://github.com/pngcui
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。