zoukankan      html  css  js  c++  java
  • 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来实现,只是这么做不太安全,因为不知道到底会合并了哪些文件。

  • 相关阅读:
    编程之美3.7 队列中最大值问题
    群聊天
    POJ 3384 Feng Shui 半平面交
    Fiberead
    熊猫资本李论:为何我不看好“轻轻家教”模式?_亿欧网_驱动创业创新
    轻轻家教_百度百科
    为什么我们要使用新型Web安全协议HSTS?
    http://www.doframe.com/jetoolweb/index.html
    http://www.16aspx.com/Code/Show/5352
    http://www.ybtsoft.com/
  • 原文地址:https://www.cnblogs.com/pngcui/p/6291189.html
Copyright © 2011-2022 走看看