http://blog.csdn.net/fbysss/article/details/44085961
一、git安装
Centos下面,就是这么任性:
yum install git
中间有2步需要输入y确认一下。
其他操作系统方法:http://git-scm.com/download/linux
安装完成后,
git --version
git version 1.7.1
验证成功。
二、.gitlab安装
GitLab是很接近Github的,而且免费,所以选择它作为项目代码仓库。地址:https://about.gitlab.com/downloads/
选择操作系统之后,会有一步步的提示。当然,有些已经有了的,就不用再安装了。可以用whereis检查一下
(curl的-O指的是把url这里的东西直接输出到文件中,文件名默认就是url中的文件名。)
sudo rpm -igitlab-7.6.2_omnibus.5.3.0.ci-1.el6.x86_64.rpm
sudo gitlab-ctl reconfigure
sudo lokkit -s http -s ssh
这句是用来做防火墙的。避免用户通过ssh方式和http来访问
按照步骤做了之后,访问http://localhost就可以进入登录界面了。
默认账号:
Username: root
Password: 5iveL!fe
进去之后就要设置新的密码,随便写一个sss54321
进来之后,可以create a new project
然后会发现,硬盘上已经生成了一个git文件: /var/opt/gitlab/git-data/repositories/root/sssApp.git
也看到了url http://localhost.localdomain:9999/root/sssApp.git
此时,在客户机中,也可以clone一下试试:
git clone http://192.168.0.12:9999/root/sssApp.git
正常。warning: You appear to have cloned an empty repository.很显然,啥也没有,只是一个空仓库。
/opt/gitlab/embedded/etc/gitconfig
[sss@localhost ~]$sudo git config --list
fatal: error processing config file(s)
touch ~/.gitconfig
OK。
——自己装过一个git,gitlab也内嵌一个。但两者显然没有关联。安装好了居然没有配置文件?啥情况。
实际上也无所谓,只不过提示信息太吓唬人了。
rm ~/.gitconfig
git config--global color.diff auto
然后再看,文件已经自动生成了。
三、创建代码仓库:
su root
mkdir /repo/sssApp
cd /repo/sssApp
git init
git remote add originhttp://localhost.localdomain:9999/root/sssApp.git
git push -u origin master
error: The requested URL returned error: 401 Unauthorized while accessing http://localhost.localdomain:9999/root/sssApp.git/info/refs
git config--list发现 remote.origin.url=http://localhost.localdomain:9999/root/sssApp.git
git config -e可以进行修改
网上很多帖子说,升级版本之后就OK,或者换SSH方式,在我看来都是不知其所以然。
其实错误提示的已经很清楚了,就是需要认证。
这啦唯一需要大家注意的,就是这里的用户名,应该是gitlab的用户名,与linux主机无关。
正确的做法:
将 remote.origin.url=http://localhost.localdomain:9999/root/sssApp.git
修改为 remote.origin.url=http://root:rootpassword@localhost.localdomain:9999/root/sssApp.git
再试就OK了。
但是问题又来了,这样把密码明文写在这里,显然不是太好。
重新来一遍,新建一个目录和库
mkdir /repo/justtest
cd /repo/justtest
git init
git remote add origin http://root@localhost.localdomain:9999/root/justtest.git
git push -u origin master
(gnome-ssh-askpass:5430):Gtk-WARNING **: cannot opendisplay:
看来是显示的问题。于是直接到Centos下,进入终端执行
这下弹出一个图形化窗口,要我输入密码。
但输入之后提示
error: src refspec master does not match any.
error: failed to push some refsto'http://root@localhost.localdomain:9999/root/justtest.git'
查询之后,发现两点:
1.Gtk这个错误,用unset SSH_ASKPASS这个命令即可。
要一劳永逸解决:
echo 'unsetSSH_ASKPASS' >> ~/.bashrc && source~/.bashrc
这样的话,就会在命令提示符提问password,secureCRT也能搞定了。
2.第二个错误,是因为这个库什么都没有(刚才成功的步骤,是有创建文件步骤的,所以没注意)
解决:
touch test.txt vi随便编辑点内容
git add test.txt
git commit test.txt
git push -u origin master
OK了。
收不到email,看看这个说明。
! [rejected] master ->master (non-fast-forward)
error: failed to push some refs to 'http://root@dev.fbysss.com/app-dev/sssApp.git'
原因是我之前改过project名称,加了一层父目录。已经提交到远程仓库中了。再次提交的话,就有冲突。
解决办法:加一个-f参数,强制推送。
文章http://blog.csdn.net/chain2012/article/details/7476493有较好的说明。
四、gitlab管理
创建一些用户,即开发人员
每一个用户,都会在 /var/opt/gitlab/git-data/repositories/下面建立一个同名目录
创建一个用户组,命名为app-dev,创建之后,发现在硬盘上有对应的目录生成
/var/opt/gitlab/git-data/repositories/app-dev
然后把刚才创建的用户加进来。作为developer
那么,问题来了。如何让用户组和这个project关联起来呢?找了半天没找到,因为group那里只有一个new project,不能选择。
不知道new一个存在的project是否ok
不过从project的左下方,有一个Transfer project,把namespace选成这个group,就ok了。
注意,修改namespace之后,发现git仓库的地址也改了:
http://localhost.localdomain:9999/app-dev/sssApp.git 而不是root了。
创建之后,在客户机里面,输入(假设服务器地址为192.168.0.12)
git clone http://192.168.0.12:9999/app-dev/sssApp.git
Cloning into'sssApp'...
Username for 'http://192.168.0.12:9999': newusername
Password for'http://newusername@192.168.0.12:9999':xxxxxx
OK。
但是问题来了。有的用户可以,但有的用户就不行
fatal:Authentication failed for'http://192.168.0.12:9999/app-dev/sssApp.git/'
原因有2.
1.密码没有设置,不能为空,需要在gitlab控制台里面设置一个。
2.密码至少8位以上。注意看提示哦
OK,这下已经可以了。
也可以用 git clone http://newuser@192.168.0.12:9999/app-dev/sssApp.git
的方式访问,直接输入密码
用普通用户在客户机上修改内容,然后git push,出现如下错误:
remote: GitLab: You don't have permission
To http://dev.fbysss.com/app-dev/sssApp.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to'http://dev.fbysss.com/app-dev/sssApp.git'
原因是这个流程还没理解。
如果用root用户肯定是可以的。
但是developoer用户,需要在本地建立分支。然后提交。然后由root来合并
后来的做法是:由root在gitlab上面给每个master建立一个branch-dev的分支,给大家提交开发。这个是有权限的。只是需要在push的时候要指定分支。
git push origin branch-dev
五、SSH方式配置:
OK,http方式是很简单,但是每次都很麻烦,要输入用户名和密码。
简单的方式,是使用ssh方式。
参考文章:http://blog.csdn.net/black_ox/article/details/17753943
1.客户端使用ssh-keygen -t rsa,会在用户目录下生成两个文件:id_rsa和id_rsa.pub
2.进入gitlab界面,profile setting,SSH Keys,内容里面填入id_rsa.pub的内容,标题随便填写。保存即可。
3.把原来的http方式,换成git@host的方式就可以了。
git clonegit@dev.fbysss.com:app-dev/sssApp.git
非常轻松的搞定。
OK,原理是什么呢?
注意看git@xxxx,说明有一个git用户。
cat /etc/passwd|grep git
git:x:496:491::/var/opt/gitlab:/bin/sh
说明这个用户的home目录不是/home/git,而是/var/opt/gitlab
ll /var/opt/gitlab/.ssh
看到一个 authorized_keys文件,打开一看,自己的名字已经在里面了。
也就是说,这个服务器对外提供一个git用户,作为ssh信任接口。其他开发人员的公钥都在git用户的authorized_keys中记录。
在服务器上配置本地的ssh访问时,出现以下问题:
[root@localhosttemp]# git clone git@192.168.0.12:app-dev/sssApp.git
Initialized empty Git repository in /root/temp/sssApp/.git/
The authenticity ofhost '192.168.0.12 (127.0.0.1)' can't be established.
其实这只是一个警告
yes之后, root的.ssh/known_host文件中自动添加了主机信息,下次就直接进来了。
六、安装nginx
http://nginx.org/en/docs/install.html
http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum install nginx
[sss@localhost ~]$whereis nginx
nginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx
OK了。
[sss@localhost ~]$/usr/sbin/nginx -v
nginx version: nginx/1.6.2
安装依赖包:
1 |
yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel |
等等。
参考文章:http://www.nowamagic.net/academy/detail/1330235
ok,启动不起来,为啥呢?原来被gitlab端口占用了。
另外,
vi/var/opt/gitlab/gitlab-shell/config.yml
/var/opt/gitlab/gitlab-rails/etc/unicorn.rb里面使用了8080,要注意。但是,修改这里也是没用的。文件里面已经写得很清楚。要修改/etc/gitlab/gitlab.rb
自己安装了一个nginx,发现gitlab安装的时候内嵌了一个。
/var/opt/gitlab/nginx/conf/gitlab-http.conf看到有端口号配置 ,这个文件是被nginx.conf文件所include的。
这里决定了gitlab对外提供服务的端口号。
在gitlab.rb里面的配置要注意:
1.一定要有端口号。如下:external_url'http://192.168.0.12:9999'
2.使用原始地址,问题在于,对外提供的git url是地址,比较难看。
3.外面再来一个nginx,配置一个域名,转到192.168.0.12:9999
4.如果外面做了转向,把这个url代理到dev.fbysss.com,就不能使用http://dev.fbysss.com,而是要原始地址。
结果:在gitlab控制面板里面看到的,还是ip+端口,但是已经可以在外面使用域名替代了。
修改80为9999之后,我想不用重启就生效,怎么办呢?
ps aux |grep nginx就知道了
[root@localhostconf]# ps aux |grep nginx
root 1138 0.0 0.0 3940 308 ? Ss 20:19 0:00 runsv nginx
root 1150 0.0 0.0 4084 332 ? S 20:19 0:00 svlogd -tt /var/log/gitlab/nginx
root 1152 0.0 0.0 26936 724? Ss 20:19 0:00 nginx: master process/opt/gitlab/embedded/sbin/nginx -p/var/opt/gitlab/nginx
495 1180 0.0 0.2 31216 3004 ? S 20:19 0:00 nginx:workerprocess
495 1181 0.0 0.0 30948 884? S 20:19 0:01 nginx:workerprocess
495 1182 0.0 0.0 30948 832? S 20:19 0:01 nginx:workerprocess
495 1183 0.0 0.0 30948 788? S 20:19 0:01 nginx: worker process
/opt/gitlab/embedded/sbin/nginx-t 检查一下:
nginx: [alert] could not open error log file: open()"/opt/gitlab/embedded/logs/error.log"failed (2: No such file ordirectory)
mkdir /opt/gitlab/embedded/logs/
就好了。但是
/opt/gitlab/embedded/sbin/nginx-s reload (注意打全路径是为了与刚安装的nginx区分)
出现错误:
nginx: [error]invalid PID number ""in"/opt/gitlab/embedded/logs/nginx.pid"
自己想出来的解决办法:直接编辑这个文件,输入1152,也就是正在运行的nginx主进程id。
ok了!
现在http://localhost:9999,已经可以了。
/var/opt/gitlab/gitlab-rails/etc/gitlab.yml
/var/opt/gitlab/gitlab-rails/etc/resque.yml
/var/opt/gitlab/gitlab-rails/etc/database.yml
/var/opt/gitlab/gitlab-shell/config.yml
/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
[sss@localhost ~]$ll/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
lrwxrwxrwx. 1 root root 43 Jan 5 23:14/opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml-> /var/opt/gitlab/gitlab-rails/etc/gitla
原来这个gitlab.yml和上一个是同一个,不过是一个链接罢了。
可以 看到,这种安装方法,与其他的都不一样,很多东西都已经打包安装了。放在/opt/gitlab/embedded下面。
sudo vi/var/opt/gitlab/gitlab-rails/etc/gitlab.yml
可以看到第一行提示:真贴心啊
# This file is managed by gitlab-ctl. Manual changes will be
# erased! To change the contents below, edit /etc/gitlab/gitlab.rb
# and run `sudo gitlab-ctl reconfigure`.
这意思就是说啊,手工修改这个配置文件是无效的,要修改就修改gitlab.rb,然后运行sudo gitlab-ctl reconfigure
可以看到,运行之后,连/var/opt/gitlab/nginx/conf/gitlab-http.conf都重新覆盖了。原来的9999又变成了80
果然,实际上只需要修改一句话:
external_url 'http://localhost.localdomain'修改成external_url'http://localhost.localdomain:9999
七、问题解决记录:搞定fatal: The remote end hung up unexpectedly
问题:在远程pc访问服务器时没有问题,在服务器本机反倒有问题了:
[sss@localhost tmp]$ git ls-remote git@localhost:app-dev/sssApp.git
fatal: 'app-dev/sssApp.git' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
http方式也没问题。
key也都加上了。
后来,没有办法,如此解决:
参考:http://serverfault.com/questions/523002/local-ssh-connection-to-gitlab-not-working
http://blog.chinaunix.net/uid-26701523-id-3383244.html
git ls-remote git@localhost:app-dev/sssApp.git 改成
git ls-remote git@localhost:git-data/repositories/app-dev/sssApp.git ——这是相对git用户的home目录/var/opt/gitlab,写全了也可以。
而这就是一种绝对路径的方式。
注意这些key的关系:
实际上,只要主机之间建立了ssh信任关系(只要客户机的pubkey已经添加到服务器对应的用户目录文件中,至于登录linux的用户名是什么,与gitlab用户名是否有关联,是否有权限,都并无关系)
但是,奇怪的是,root用户又没有这个问题。
注意,如果我们把gitlab中的root用户名修改为root2,再来测试,则会报错,只不过报错提示不一样。
[sss@localhost tmp]$ sudo git ls-remotegit@localhost:root/justtest.git
Access denied.
fatal: The remote end hung up unexpectedly
其他参考:
终于,功夫不负有心人!问题得以解决!
原因出在cat /var/opt/gitlab/.ssh/authorized_keys 里面。也正是通过查找一些资料,激发灵感来看一看这个文件,从而找到了线索。
以下贴出authorized_keys 部分内容:
我们发现,有两行来处理sss@localhost.localdomain。
其中一个有command,一个则没有。
分析:没有command的这一行,显然有些奇怪。似乎就是我开始自己手工用cat /home/sss/.ssh/ida_rsa.pub>>追加进去的。删掉是不是就可以了呢?
备份authorized_keys 文件
然后删除没有command的哪一行。
ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAo7JeBNBQaSGBmq5cqxKRgYiG6/aUS7waFUbcBQ8Fwpz2+LfV2shK/zH1evAQPHq+AyuuaH5ZSnbrhT1YnX5/7u2GO1rHf24G3dljxitOY9Dvsy3hXDS067LZ356jNlPCMlzAPTLe9owKLY72HKDwYsA4E7SRDGjZGaKNQmCmRTglpQXlFqwMMzvJ6SeEAKZg7xkr+KyUKypdVMXsSsegNOHuNkUOfo+j8hFYCnySS7XXH6YUNNYrTnOAT7t9NtLpuF7XdjzqdNz0h8I8V4yMV33OFRZAWWAAtpSwuLeOOMtUasZOg6fk2TL96JmtGR4oOb0qZsD6A7F/hn8+cHeQtw==sss@localhost.localdomain
command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shellkey-16",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptyssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEA3Rrnrou8vC31RPj/1M9uGT5Cp7FDcY9TIF+7JZFhsbOxwB7CV2r2QrLcQpHw/ZyhKWB3FM9eUY3JhJEL8rVcZwoFAsQBVI2oPUisGkUMxWO822RBy2zukR3kjqFWbIrVHqr2tY00roI6Qj187fEjs6FfoMqYxn5/y+oI05n91r8pmPP3TI3OmxqtoJYuNxkZbOrR5xR9IQ7C9Fw1uJjh9ngKTvc9mCiqo67TIjIRFK71eikwIrmkail+wDfs0B478EW6aSHDdElUMYLW6yLKloRAGTEHrnSlEsEZpVIJh1bwe0gi/gkxsbBNU+zc8eIxTiCOind1EYH+/cDCYuiiaw==root@localhost.localdomain
command="/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shellkey-18",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-ptyssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAo7JeBNBQaSGBmq5cqxKRgYiG6/aUS7waFUbcBQ8Fwpz2+LfV2shK/zH1evAQPHq+AyuuaH5ZSnbrhT1YnX5/7u2GO1rHf24G3dljxitOY9Dvsy3hXDS067LZ356jNlPCMlzAPTLe9owKLY72HKDwYsA4E7SRDGjZGaKNQmCmRTglpQXlFqwMMzvJ6SeEAKZg7xkr+KyUKypdVMXsSsegNOHuNkUOfo+j8hFYCnySS7XXH6YUNNYrTnOAT7t9NtLpuF7XdjzqdNz0h8I8V4yMV33OFRZAWWAAtpSwuLeOOMtUasZOg6fk2TL96JmtGR4oOb0qZsD6A7F/hn8+cHeQtw==sss@localhost.localdomain
结果,再次运行git ls-remote git@localhost:app-dev/sssApp.git
发现提示有了变化!
Access denied.
fatal: The remote end hung up unexpectedly
这不就是类似root开始的提示——root如何好的?可能就是在gitlab中增加了key。
再看路径,这个路径本来就没有给sss用户赋予权限。
我们用一个别的仓库,授权给sss,然后再来,OK!
ok,我们顺藤摸瓜,搞清楚gitlab的机制。/opt/gitlab/embedded/service/gitlab-shell/bin/gitlab-shellkey-18是什么呢?
原来,gitlab中,公钥的规则是这样的:
1.私钥只能有一份,但是可以挂在任何用户之下。
2.私钥就对应command中的key-n,运行这句命令,可以看到命令行提示
Welcome to GitLab, <username>!
sss这个linux用户的公钥挂在哪个gitlab用户下,用git访问 git@localhost:app-dev/sssApp.git 就会对应check gitlab的相应用户的权限,并进行路由。
——此问题google了N遍,有人说使用gitlab-rake
也在这里找到了官方的说明:
https://github.com/gitlabhq/gitlabhq/blob/master/doc/raketasks/maintenance.md
Rebuildauthorized_keys file
In some case itis necessary to rebuild the authorized_keys file.
ForOmnibus-packages:
sudogitlab-rake gitlab:shell:setup
Forinstallations from source:
cd/home/git/gitlab
sudo -ugit -H bundle exec rake gitlab:shell:setup RAILS_ENV=production
This willrebuild an authorized_keys file.
You willlose any data stored in authorized_keys file.
Do youwant to continue (yes/no)? yes
............................
那么,我们也来试试吧:
备份正确的auth文件,然后把原来有问题的文件拷贝过来覆盖。
再运行git命令,有问题。
[root@localhostgitlab]# gitlab-rake gitlab:shell:setup
This will rebuild an authorized_keys file.
You will lose any data stored in authorized_keys file.
Do you want to continue (yes/no)? yes
再看authorized_keys ,已经正确了。显然是根据gitlab数据库的信息去更新的。
再运行 git ls-remotegit@localhost:app-dev/sssApp.git,一切OK!
[sss@localhosttmp]$ git ls-remote git@localhost:sss/justtest.git
a502e8cc45e8f7de05905d94faf5c59ce57c2b10 HEAD
a502e8cc45e8f7de05905d94faf5c59ce57c2b10 refs/heads/master
======================
问题:发现我的工程总不能顺利的从git更新,每次都需要输入git用户的密码。
排查:在eclipse设置里面搜索ssh,看到SSH2 Home设置有问题。设置的ssh目录没有前面的一点。原因未知。
解决:将目录更改正确即可。
——中间还尝试过,使用key management,可以生成DSA和RSA,但和自己生成的的内容不同。loadfile的时候,出现提示 failed to load given file.因为有上面的解决办法,所以这个问题暂时不予深究。
遗留问题:
ok,对于团队开发,用一个ip地址也确实太low了。至少用一个内部域名吧。
http://localhost.localdomain修改为http://dev.fbysss.com
然后 sudo gitlab-ctl reconfigure
这一次作为服务一直启动,停在那里了。其实已经好了。不管他——后来报错了,是内存不足。
客户端配置hosts文件,测试,OK。
试想一下,gitlab应该是做了什么手脚,让webserver能够解析这个域名。
查找nginx.conf,没有发现改动。不过从
/var/log/gitlab/nginx/gitlab_access.log
可以看到,访问过来的url已经是带域名的了。
——待弄清,到底在哪里设置了。
相关推荐
无Mac机IOS开发环境搭建手记
Ubuntu 10.10 下嵌入式 QT 开发环境搭建手记 本文档是关于在 Ubuntu 10.10 操作系统下搭建嵌入式 QT ...在本文档中,作者提供了一份详细的搭建环境的步骤记录,可以作为参考,帮助读者更好地搭建嵌入式 QT 开发环境。
qt下载,ubuntu10.10下嵌入式QT开发环境搭建手记
### Android Studio 开发环境搭建详解 #### 一、概述 随着移动互联网的飞速发展,Android平台已经成为全球最大的移动操作系统之一。为了满足开发者的需求,Google推出了Android Studio作为官方推荐的集成开发环境...
《网页开发手记--实战详解》由叶青、孙亚南、孙泽军编著,笔者将网页制作技术粗略划分为前台浏览器端技术和后台服务器端技术。本书主要学习前台浏览器端技术,也就是静态页面制作技术。早期只需要使用HTML即可单独...
这份手记可能包含了他在编程、项目管理、团队协作以及个人技能提升等方面的经验分享,旨在帮助初入IT行业的新人更好地适应工作环境,积累必要的知识和技能。 描述中的“抛砖引玉”意味着作者希望通过自己的经验和...
《IT项目经理成长手记》是一本专为那些渴望在信息技术领域中担任项目经理角色的人们精心编写的指南。这本书深入探讨了IT项目管理的核心概念、关键技能以及实际操作中的经验教训,旨在帮助读者从新手到专家逐步提升...
养老院调查走访手记分享.pdf
Word模板-家访手记表.wpt
高考政治知识点:名师手记6.docx
backtrack45100网卡破解密码实战手记参照.pdf
新建文本文档(数据库sql server手记).txt
项目管理实践经验; 行文特点通俗直接,脉络清晰; 大量的图标,易懂。
IT项目经理成长手记PDF,非常不错的资源
IT项目经理成长手记IT项目经理成长手记IT项目经理成长手记IT项目经理成长手记IT项目经理成长手记
《IT项目经理成长手记》是一本专为IT行业项目经理及有志于此领域发展的专业人士准备的实战指南。本书通过虚拟人物小M的成长经历,系统性地讲述了项目管理的实践技巧和经验教训,旨在帮助读者理解并掌握项目管理的...
P道理 ERP项目实施手记.童继龙,童继明著.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
作网页开发的朋友可以参考此书,挺经典的,实例简单,适合初级读者
【深度无盘网吧系统安装手记服务端】 深度无盘网吧系统是一款专为网吧环境设计的无盘技术解决方案,它允许客户机在没有本地硬盘的情况下,通过网络从服务器获取操作系统和数据,从而节省硬件成本并便于系统管理和...