分类目录归档:Git

Gitlab 安装 与 基本使用

地址:https://about.gitlab.com/downloads/

#CentOS 6.x 7.x下,YUM安装:

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | bash
yum install gitlab-ce

这里实际是安装/etc/yum.repos.d/gitlab_gitlab-ce.repo,这里引用的连接比较缓慢。可以参考https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/:

[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key

然后运行:

yum makecache
yum install gitlab-ce

也可以直接下载RPM包进行安装:

#CentOS 6.x
curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/6/gitlab-ce-XXX.rpm/download
rpm -i gitlab-ce-XXX.rpm

#CentOS 7.x
curl -LJO https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-XXX.rpm/download
rpm -i gitlab-ce-XXX.rpm

完成安装后运行:

#产生配置
gitlab-ctl reconfigure

#启动
gitlab-ctl start

首次登录并修改密码。gitlab-ctl reconfigure会产生一个Nginx配置,默认监听80端口。直接IP地址即可访问。

———————————————————————————————————–
Giblab全局配置文件:/etc/gitlab//etc/gitlab/gitlab.rb,修改后需要运行gitlab-ctl reconfigure重新产生配置文件。

Gitlab使用Nginx作为HTTP服务器,如果本地已经安装了Nginx,通常80端口已经被占用,这个使用需要修改Gitlab使用的Nginx的实例的HOST配置不要占用80端口,修改/etc/gitlab//etc/gitlab/gitlab.rb,指定external_url ‘http://gitlab.vfeelit:8000’,然后gitlab-ctl reconfigure后就会产生新的配置:

vi /var/opt/gitlab/nginx/conf/gitlab-http.conf
#自动生成的HOST配置
server {
  listen *:8000;
  server_name gitlab.ifeeline;
  server_tokens off; ## Don't show the nginx version number, a security best practice
  root /opt/gitlab/embedded/service/gitlab-rails/public;
}

另外一个常见的是发送邮件配置,以下是QQ企业邮箱为例子:

vi /etc/gitlab/gitlab.rb

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "gitlab@vfeelit.com"
gitlab_rails['smtp_password'] = "xxx"
gitlab_rails['smtp_domain'] = "smtp.qq.com"
gitlab_rails['smtp_authentication'] = :plain
gitlab_rails['smtp_enable_starttls_auto'] = true

# gitlab_rails['smtp_tls'] = false
# gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
# gitlab_rails['smtp_ca_path'] = "/etc/ssl/certs"
# gitlab_rails['smtp_ca_file'] = "/etc/ssl/certs/ca-certificates.crt"

gitlab_rails['gitlab_email_from'] = "gitlab@vfeelit.com"
user['gitlab_user_email'] = 'gitlab@vfeelit.com'

注意最后两个配置,这个是邮件发送商的限制(以登陆账户的邮件帐号发邮件)。修改完成后运行gitlab-ctl reconfigure,去到/var/opt/gitlab/gitlab-rails/etc/smtp_settings.rb:

/var/opt/gitlab/gitlab-rails/etc/smtp_settings.rb

if Rails.env.production?
  Gitlab::Application.config.action_mailer.delivery_method = :smtp

  ActionMailer::Base.smtp_settings = {
    authentication: :plain,
    address: "smtp.exmail.qq.com",
    port: 25,
    user_name: "gitlab@vfeelit.com",
    password: "xxx",
    domain: "smtp.qq.com",
    enable_starttls_auto: true,



    ca_file: "/opt/gitlab/embedded/ssl/certs/cacert.pem",
  }
end

这个文件是gitlab-ctl reconfigure后自动生成的,所以一般不需要直接编辑它。

CHECK:

tcp        0      0 127.0.0.1:8080              0.0.0.0:*                   LISTEN      3878/unicorn master 
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3845/nginx          
tcp        0      0 127.0.0.1:18198             0.0.0.0:*                   LISTEN      3859/redis-server 1 
udp        0      0 127.0.0.1:39151             127.0.0.1:39151             ESTABLISHED 3851/postgres

默认至少安装了nginx,redis。 安装位置:/opt/gitlab,进入/opt/gitlab/bin:

gitlab-ci-rails  gitlab-ci-rake  gitlab-ctl  gitlab-rails  gitlab-rake

需要知道gitlab-ctl这个工具:

gitlab-ctl reconfigure
gitlab-ctl show-config
gitlab-ctl uninstall
gitlab-ctl restart
gitlab-ctl start
gitlab-ctl stop

比如整体启动 或 停止,就需要它。

gitlab-ctl stop
ok: down: logrotate: 0s, normally up
ok: down: nginx: 1s, normally up
ok: down: postgresql: 0s, normally up
ok: down: redis: 1s, normally up
ok: down: sidekiq: 0s, normally up
ok: down: unicorn: 0s, normally up

安装完成后,首次登录会提示修改密码,密码修改了之后就会进入一个Dashboard界面:
Gitlab Dashboard

如果使用过Github,那么对Gitlab应该不陌生,Gitlab跟Github很多地方都非常类似。用如下图说明大体概念:
Gitlab 结构图
用户可以建立一个或多个组(Namespace),在一个组中可以建立多个项目(Project)。每个组和项目都有一个Members的概念,组的Members意味着可以操作组下的所有项目(根据Group Access决定),项目的Members可以操作具体的项目(根据Group Access决定)。注意:组的创建者也是组的Member,并且它的Group Access是Owner(拥有者);项目的创建者也是项目的Member,并且它的Project Access是Owner(拥有者)。项目在添加成员时,Project Access不可以指定是Owner,说明项目的拥有者只能是创建者,但是组在添加成员时可以指定它的Group Access为Owner,说明组可以有多个拥有者。

默认gitlab安装好之后有一个root用户,可以经过它直接创建用户(也可以用户自己去申请),在创建用户时(右上角的Admin Area,只有用户时管理员时才显示):
Gitlab添加用户
Can create group设置用户是否可以创建组,如果不勾选,此用户将无法创建组。注:默认用户创建的项目如果没有指定组,默认就是一个和用户名一样的组中,意思就是不存在没有组(Namespace)的项目。

如果勾选Admin,那么这个用户就成了管理员,那么这个用户登录后右上角就会有进入Admin Area的按钮,看起来,它跟root具备最高权限。

为了可以推送项目,还需要正确设置RSA秘钥,具体怎么生产秘钥,这里忽略,进入Profile(右上角),点击SSH Keys:
Gitlab SSH Key设置
只有把公钥粘贴上去后才能通过SSH协议进行推拉项目。

项目建立好之后,会有提示:
Gitlab链接
这个是项目的发布地址。接下来是一些初始化脚本和如果推送的命令:

git config --global user.name "ifeeline"
git config --global user.email "ifeeline@qq.com"

#初始化一个项目,然后推送
mkdir tt
cd tt
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin git@gitlab.vfeelit.com:test/tt.git
git push -u origin master

#推送一个已经存在的项目
cd existing_git_repo
git remote add origin git@gitlab.vfeelit.com:test/tt.git
git push -u origin master

——————————————————————————————-
备份: 默认以时间戳命名备份的包,存放目录为/var/opt/gitlab/backups

gitlab-rake gitlab:backup:create

——————————————————————————————-
迁移:
迁移就是还原备份,为了避免潜在的问题,一般在新机器上按照了Gitlab后,然后把旧机器的Gitlab做版本升级,以保持新旧机器上的Gitlab版本一致。然后把备份传递到新机器:

# 旧机器,推送备份到新机器
scp /var/opt/gitlab/backups/1481857595_gitlab_backup.tar root@xx.xx.xx.xx:/var/opt/gitlab/backups

# 新机器
cd /var/opt/gitlab/backups 
chown git:git 1481857595_gitlab_backup.tar

#停止相关数据连接服务
gitlab-ctl stop unicorn
gitlab-ctl stop sidekiq

# 从1481857595还原备份
gitlab-rake gitlab:backup:restore BACKUP=1481857595

# 启动
gitlab-ctl start

由于修改了IP地址,如果出现WARNING: POSSIBLE DNS SPOOFING DETECTED! 或和WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED之类的警告,去.ssh下,编辑known_hosts,把原来IP对应的公钥那行记录删除。或者直接删除known_hosts文件。

永久链接:http://blog.ifeeline.com/1628.html

使用Github建立一个公共仓库

Github注册

Githut建立仓库

填写仓库名字,描述可以选填,然后选择Public(只能选Public,意思大家都可以看到,Private是收费版提供的功能)。

Initialize this repository with a README如果勾上,就相当于对仓库做了初始化操作。客户端设置时就需要先git clone下来。这里先不选。
Githut获取仓库地址
这里给出了SSH的地址。还给出了如何创建一个新的仓库的方法或推送一个已经存在的仓库到Github。

不过在操作之前需要先把公钥送到服务器,否则无法通信。

root@vfeelit:~# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

直接使用ssh-keygen生成秘钥对,提示密码是直接回车表示不使用密码。

把/root/.ssh/id_rsa.pub内容拷贝下来,然后到Github的你的账户设置中设置公钥:
Github添加SSH Key
把公钥贴进来。这样,客户端就可以和Github通信了。

root@vfeelit:~# cd ifeeline/
root@vfeelit:~/ifeeline# touch README.md
root@vfeelit:~/ifeeline# git init					##初始化,本地生成.git文件夹
Initialized empty Git repository in /root/ifeeline/.git/
root@vfeelit:~/ifeeline# git add README.md		##添加任务
root@vfeelit:~/ifeeline# git commit -m "first commit"	##添加到版本库
[master (root-commit) f75b3fc] first commit
 0 files changed
 create mode 100644 README.md

##以上操作在本地完成,然后把本地库和远程进行关联
root@vfeelit:~/ifeeline# git remote add origin git@github.com:vfeelit/ifeeline.git
root@vfeelit:~/ifeeline# git push -u origin master  	##把本地库进行推送
The authenticity of host 'github.com (192.30.252.129)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.252.129' (RSA) to the list of known hosts.
Counting objects: 3, done.
Writing objects: 100% (3/3), 203 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:vfeelit/ifeeline.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

实验:

##新建一个文件
root@vfeelit:~/ifeeline# vi index.php
root@vfeelit:~/ifeeline# ls
index.php  README.md

##添加新文件
root@vfeelit:~/ifeeline# git add index.php
root@vfeelit:~/ifeeline# git status -s
A  index.php

##提交新文件
root@vfeelit:~/ifeeline# git commit -m "add new file index.php"
[master 68a0842] add new file index.php
 1 file changed, 2 insertions(+)
 create mode 100644 index.php

##同步到Github
root@vfeelit:~/ifeeline# git push -u origin master
Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts.
Counting objects: 8, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 512 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)
To git@github.com:vfeelit/ifeeline.git
   f75b3fc..68a0842  master -> master
Branch master set up to track remote branch master from origin.

从上面操作可知,Github上的是本地的一份镜像,本地修改完毕后需要推送过去。多人协作时可以先克隆下来,然后每人在本地都有一份完整拷贝,修改后进行推送。

永久链接:http://blog.ifeeline.com/999.html

使用Git创建第一个项目

例子来自 版本控制之道 – 使用Git,这个书对Git的介绍非常通俗易懂。仅做些笔记。

Git的安装这里就不做笔记了。

## Git安装好之后必须设置的有两项:
root@vfeelit:~# git config --global user.name "Jerry Sha"
root@vfeelit:~# git config --global user.email "vfeelit@qq.com"

##查看设置是否成功
root@vfeelit:~# git config --global --list
user.name=Jerry Sha
user.email=vfeelit@qq.com

所有可设置的值超过130个。其中大部分很少用得上。不过有一个例外:关于用不同颜色显示Git命令的输出。

如想在命令行窗口中使用不同的颜色显示不同类型的内容,需要将color.ui的值设为auto或always。

root@vfeelit:~# git config --global color.ui "always"

root@vfeelit:~# git config --list
color.ui=always
user.name=Jerry Sha
user.email=vfeelit@qq.com

1 创建版本库
Git中,版本库(.git目录)与工作目录并排放在同一个目录中。创建版本库,进入任意目录(存放源代码的目录),运行git init:

root@vfeelit:~# mkdir mysite
root@vfeelit:~# cd mysite
root@vfeelit:~/mysite# git init
Initialized empty Git repository in /root/mysite/.git/

创建完成(建立了一个空版本库)。git init会创建一个.git目录。这个目录用来存放版本库的全部元数据。mysite目录作为工作目录树,存放从版本库中检出的代码。

2 代码修改
创建一个叫index.html的文件,内容如下:

vi index.html
<html>
<body>
        <h1>Hello World!</h1>
</body>
</html> 

要想让Git跟踪这个文件,须先使用git add命令把该文件添加到版本库的索引(index),然后使用git commit命令提交到版本库。

root@vfeelit:~/mysite# git add index.html
root@vfeelit:~/mysite# git commit -m "1. add in hello world HTML"
[master (root-commit) 8785596] 1. add in hello world HTML
 1 file changed, 5 insertions(+)
 create mode 100644 index.html

git commit命令创建一个提交记录。提交记录是存储在版本中的历史记录,每提交一次创建一个记录,并标记出代码的演进。Git把提交者的姓名和邮件地址,已经提交留言,都添加到提交记录中。

命令中参数-m的所用是,告诉Git本次提交的提交的留言。运行命令git log可以看到这个提交的信息:

root@vfeelit:~/mysite# git log
commit 8785596828af89582dfd15bef15832818200cbc4
Author: Jerry Sha <vfeelit@qq.com>
Date:   Wed Sep 11 01:30:21 2013 +0800

    1. add in hello world HTML

3 在项目中工作
编辑index.html,添加head标签

vi index.html
<html>
<head>
        <title>Hello World in Git</title>
</head>
<body>
        <h1>Hello World!</h1>
</body>
</html>

Git可以检查到文件被修改。命令git status会显示工作目录树的状态。

root@vfeelit:~/mysite# git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#	modified:   index.html
#
no changes added to commit (use "git add" and/or "git commit -a")

输出结果表明Git检测到了修改。修改过的文件在Changed but not updated下列出来,如果要提交,需要先使用git add或git commit –a。

Git中有三个存放文件的地方,第一是工作目录,第二是暂存区(index),第三是版本库。暂存区存放的是打算要提交到版本库的修改。一般,先在工作区修改文件,然后使用git add同步到暂存区,然后使用git commit提交的版本库。

root@vfeelit:~/mysite# git add index.html
root@vfeelit:~/mysite# git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#	modified:   index.html
#

git add之后,执行git status可以看到,输出信息变成了Changes to be committed。

使用命令git commit时,不要忘记带-m参数:

##可以多次使用m参数写多条留言
root@vfeelit:~/mysite# git commit -m "2. add <head> and <title> to index" -m "This allows for a more semantic document."
[master 8b79b15] 2. add <head> and <title> to index
 1 file changed, 3 insertions(+)

##参看日志,后面的-1表示显示最近的1条日志
root@vfeelit:~/mysite# git log -1
commit 8b79b151f02b89a12e4f5006d49ec2cbe1e80cad
Author: Jerry Sha <vfeelit@qq.com>
Date:   Wed Sep 11 01:51:37 2013 +0800

    2. add <head> and <title> to index
    
    This allows for a more semantic document.

4 理解并使用分支
用两种分支比较有用:用来支持项目的不同发布版本的分支,已经用来支持一个特定功能的开发的分支。

分支可以为要发布的代码保留一份拷贝,所以无须停止正在开发的工作。创建分支的命令是git branch,该命令需要两个参数:新分支名称和父分支名称。

root@vfeelit:~/mysite# git branch RB_1.0 master

该命令从主分支上创建一个叫RB_1.0的分支。分支名称中的RB代表发布分支(release branch)。该前缀可以让人快速分辨出哪些分支是发布分支。

注意:这个时候master 和 RB_1.0指向同一个提交,分支实际上是.git/refs/heads下的一个引用文件:

root@vfeelit:~/mysite/.git/refs/heads# ls
master  RB_1.0
root@vfeelit:~/mysite/.git/refs/heads# cat master 
8b79b151f02b89a12e4f5006d49ec2cbe1e80cad
root@vfeelit:~/mysite/.git/refs/heads# cat RB_1.0 
8b79b151f02b89a12e4f5006d49ec2cbe1e80cad

master和RB_1.0都可以基于这个提交继续开发,但是master和RB_1.0都会指向它们最新的提交,如果一个分支没有类似的master和RB_1.0的引用(或叫指针),那么该分支就叫端头分支。可以把分支进行合并,分支合并后分支的引用是可以删除的(实际仅仅是一个引用文件而已),当然,分支合并可能会有冲突。

接下来继续在主分支上修改代码(它不影响发布分支):

##在index.html的</body>前添加:
        <ul>
                <li><a href="bio.html">Biography</a></li>
        </ul>

##提交
git commit -a

命令git commit带了a参数,告诉Git提交全部修过过的文件。此时主分支上有3个提交。发布分支上还是原来的代码(两个分支),切换到发布分支:

root@vfeelit:~/mysite# git checkout RB_1.0
Switched to branch 'RB_1.0'
root@vfeelit:~/mysite# cat index.html 
<html>
<head>
	<title>Hello World in Git</title>
</head>
<body>
	<h1>Hello World!</h1>
</body>
</html>

##在发布分支上做发布前最后修过,在head中添加meta
vi index.html
<head>
        <title>Hello World in Git</title>
        <meta name="description" content="hello world in Git" />
</head>

##然后提交
root@vfeelit:~/mysite# git commit -a -m "3 at branch."
[RB_1.0 973ec20] 3 at branch.
 1 file changed, 1 insertion(+)

这个时候两个分支都有三个提交。这个时候需要发布了。为此要给这个版本打个标签。

5 处理发布
给Git中的代码打标签,意味着在版本库的历史中标记出特定的点,这样将来就容易找到相应的代码。因为要做1.0版的发布,所以打一个名为1.0的标签:

root@vfeelit:~/mysite# git tag 1.0 RB_1.0

命令的两个参数指明了标签的名称和希望打标签的点,分别是1.0和RB_1.0分支的最新指向。用不带参数的git tag可以查看标签列表:

root@vfeelit:~/mysite# git tag
1.0

Git分支

master分支继续作为2.0的开发。现在要把RB_1.0分支上所做的修改合并到主分支上来。变基命令git rebase可以完成这项工作。变基是把一条分支上的修改在另一条分支末重现。

##切换回到主分支
root@vfeelit:~/mysite# git checkout master
Switched to branch 'master'

##接着运行命令git rebase,后跟一个参数,表示主分支变基到哪条分支(就是父节点是哪个点)
root@vfeelit:~/mysite# git rebase RB_1.0
First, rewinding head to replay your work on top of it...
Applying: 3. Maste to branch.

Git分支 变基
这里发生的事情是,master分支的最新提交的父亲改为了RB_1.0分支的最后提交,并且把它们的差异进行了合并(可能发生冲突,这里没有)并提交,当前master指向了这个最新的提交,可以通过git log查看主分支现在有四个提交。注意看虚线部分,这个对象此时并没有被删除,只是没有了引用指向它。

此时,RB_1.0这个分支是没有用了的(已经打了标签),可以删除(实际就一个引用文件)。

root@vfeelit:~/mysite# git branch -d RB_1.0
Deleted branch RB_1.0 (was 973ec20).

如果将来要给1.0.x分支打补丁,只需要从打标签的地方再创建一条分支即可。

root@vfeelit:~/mysite# git branch RB_1.0.1 1.0
root@vfeelit:~/mysite# git checkout RB_1.0.1
Switched to branch 'RB_1.0.1'

运行命令git log快速查看历史记录,可以看到RB_1.0.1分支上只有3个提交(不包含主分支上的最新提交):

root@vfeelit:~/mysite# git log --pretty=oneline
973ec20246a45fa863d7017e35386aef7a5b1d7e 3 at branch.
8b79b151f02b89a12e4f5006d49ec2cbe1e80cad 2. add <head> and <title> to index
8785596828af89582dfd15bef15832818200cbc4 1. add in hello world HTML

归档打包:

root@vfeelit:~/mysite# git archive --format=tar \
> --prefix=mysite-1.0 1.0 \
> | gzip > mysite-1.0.tar.gz

第一个参数format指明要产生tar格式的输出,第二个,prefix指明包中所有东西都放到mysite-1.0目录下。最后,1.0指明需要归档的标签名称。

6 克隆远程版本库

git clone git://github.com………  本地名称

永久链接:http://blog.ifeeline.com/993.html