代码管理平台
@(Linux学习)
文章目录
你要了解的常识
- 版本控制,记录若干文件内容变化,以便将来查阅特定版本修订情况
- 版本管理工具发展简史,参考 http://luckypoem14.github.io/test/2012/04/24/scm-history/
graph LR
cvs-->svn
svn-->git
- svn全称subversion,是一个开源版本控制系统,始于2000年
- git是linux创始人linus发起的,2005年发布,最初目的是更好管理linux内核代码
- git和svn不同在于git不需要依赖服务端就可以工作,即git是分布式的
- 关于git和svn的比较大家参考 http://blog.lishiming.net/?p=305
- github是基于git的在线web页面代码托管平台,可以选择付费服务
- gitlab可以认为是一个开源的github,两者没有直接关系
安装svn
- yum安装
yum install -y subversion
- 创建版本库
mkdir -p /data/svnroot/myproject
svnadmin create /data/svnroot/myproject
- 配置权限密码文件
cd !$/conf #authz为权限配置文件,passwd为密码文件
vim authz//配置文件改为如下
[groups]
admins = aming,user1
[/]
@admins = rw
*= r
[myproject:/]
user1 = rw
vim passwd//加入如下内容
[users]
aming = aming_!(*$123
user1 = user1_^^^123
user2 = user2-***123
vim svnserver.conf//更改或增加如下内容
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = /data/svnroot/myproject
- 启动svn
svnserve -d -r /data/svnroot //这样就启动了
客户端上使用svn(linux)
yum install -y subversion
svn checkout svn://192.168.133.130/myproject --username=aming
cd myproject ; ls -la
cp /etc/fstab .
svn add . //添加到版本控制中心
svn commit -m “add file” //把文件上传到服务器
svn delete filename //在本地删除
svn commit -m “delete filename” //在服务器上删除
svn update //把当前目录下的文件都更新到最新版
svn log //查看变更日志
客户端上使用svn(windows)
-
官网 https://tortoisesvn.net/index.zh.html
-
下载TortoiseSVN 并安装
简明教程 http://www.jianshu.com/p/6b3b7b915332
单机上使用git
- 安装
yum install -y git
mkdir /data/gitroot
cd /data/gitroot
git init //初始化仓库
echo -e “123\naaa\n456\nbbb” > 1.txt //创建一个新文件
git add 1.txt//把1.txt添加到仓库
git commit -m “add new file 1.txt” //add完了必须要commit才算真正把文件提交到git仓库里
再次更改1.txt
git status //查看当前仓库中的状态,比如是否有改动的文件
git diff 1.txt //可以对比1.txt本次修改了什么内容,相比较仓库里面的版本
- 版本回退
多更改几次1.txt,然后add,commit
git log//查看所有提交记录
git log --pretty=oneline//一行显示
git reset --hard f7c8e9//回退版本,其中后面跟的字符串是简写
撤销修改
rm -f 1.txt//不小心删除了1.txt
git checkout -- 1.txt//恢复1.txt
如果1.txt文件修改,add后但没有commit,再想回退到上一次提交的状态,可以使用git reset HEAD 1.txt,再执行git checkout -- 1.txt
git reflog //查看所有历史版本
- 删除文件
echo -e "11111111111\n2222222222" > 2.txt
git rm 2.txt
git commit -m "rm 2.txt"
建立远程仓库
- 首先到 https://github.com 注册一个账号
- 创建仓库
创建自己的git,点repositories 再点new
名字自定义,比如叫studygit 选择public 点 create repository
- 在本地创建ssh key
ssh-keygen -t rsa -C "651795459@qq.com"
- 拷贝公钥到github
linux上
cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCgYjF4g9zSq+X/23n46+w2UVcwdDOMBHnjGaOPtju2bBacVs9HUG74dxRgcDe1hqs7zXKTW/ikmOcG8oaQ7rb3+1YMxS4wnshXOZpsZGf9IxYk05RfL04ITXUuVNKAkQjnVtDU624wxlQWLZiwE1CwDsRkIT/PXgqEYuQ1SLwpSkcLeap3i09omDtUsKH9Yfx2rRHawjvYLMHnrOZuOPro1u2bOh71iTZGZG6m+3n1XR8ubOdkcqP+P8cZInJ/J6CuckTwxydHHSbth0iYV0YJfhHVcrJrDIACrKZFGSFz0QfsNo+vFya3x+s0ZEoyrmeXKTrn56AcqI1/Txju752H 651795459@qq.com
windows上
C:\Users\Administrator\.ssh\id_rsa.pub
添加key:右上角点自己头像,选择settings,左侧选择SSH and GPG keys
左侧点New SSH key,把linux机器上的~/.ssh/id_rsa.pub内容粘贴到这里
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDS8Bcau1oaqhlEHCRJmurfZN8K15l7Oir/E57zSOrXse03WvTLGks6kvYDP80DA+AI1poZLA31TgO+n6FtE1bAxQJn3B7H1IMTA9z3t060npw6pQPSNeIgWraPwWd7/MJloms9PuwjfTsM6g/9Jr1y3Jtm3cKfJU3CRAv/9CjqmU50lusuk/gpbKSoOiePfn7K49ldrUrMQOOr5fo2u5DHtUR41egAn/XzBuiUbUSbNl6CIqyLBLboYKQti1d5fY9e5pnK1dLZy88DxZXEC7j9vR8/+8Ivtmn3ZKopvd+LD0H6LxSbyq+n2L54xDbKvw9Iiz+oZv2B6kxU0IxsK02L 651795459@qq.com
- 验证是否成功,在git bash下输入
$ ssh -T git@github.com
Hi chensslinux! You've successfully authenticated, but GitHub does not provide shell access. //看到这个表示成功添加
- 把本地仓库推送到远程仓库
git remote add origin git@github.com:aminglinux/studygit.git //这一步是在远程创建一个新的仓库studygit,名字尽量和本地的一致
如果这一步报错,先执行:
git remote rm origin
- 推关代码到远程仓库
git push -u origin master //然后把本地的studygit仓库推送到远程的studygit
下一次再推送,就可以直接 git push
克隆远程仓库
cd /home
git clone git@github.com:aminglinux/lanmp.git
它提示,会在当前目录下初始化一个仓库,并创建一个.git的目录,如下
Initialized empty Git repository in /home/lanmp/.
git/完成后,ls可以看到一个lanmp的目录
cd lanmp
vi lanmp.sh 编辑一下文件,然后提交
git add lanmp.sh
git commit -m "sdlfasdf"
然后再推送到远程服务端
git push
分支
- 查看分支
git branch
- 创建分支
git branch aming
- 切换到了aming分支下
git checkout aming
- 再用git branch查看,会看到有两个分支master和aming,当前使用的分支前面会有一个*在aming分支下
# git branch
chenss
* master
- 编辑2.txt,并提交到新分支
echo "askdfjlksadjflk" > 2.txt
git add 2.txt
git commit -m "laksjdflksjdklfj"
- 切换回master分支
git checkout master //此时cat 2.txt发现并没有更改内容.所以分支与分支之间的内容是分开的
分支的合并
- 合并分支之前,先切换到目标分支
git checkout master
- 把aming分支合并到了master
git merge aming
- 分支冲突问题
如果master分支和aming分支都对2.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。
解决冲突的方法是在master分支下,编辑2.txt,改为aming分支里面2.txt的内容。 然后提交2.txt,再合并aming分支。
但是这样有一个问题,万一master分支更改的内容是我们想要的呢? 可以编辑2.txt内容,改为想要的,然后提交。切换到aming分支,然后合并master分支到aming分支即可(倒着合并)。
- 合并分支有一个原则,
那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。
[root@css03 git3]# cat 1.txt
aaaaaaaaaa
bbbbbbbb
<<<<<<< HEAD
master
=======
chenss
>>>>>>> chenss
- 删除分支
git branch -d aming
- 如果分支没有合并,删除之前会提示,那就不合并,强制删除
git branch -D aming
使用分支的原则
- 对于分支的应用,建议大家以这样的原则来:
- master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。
- 创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master
- 开发人员应该在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rmIcJg8k-1615193553146)(9A7F494B55FF4E83AA99725D13399497)]
- dev分支合并bob分支的命令是:
- git checkout dev //先切换到dev分支,然后
- git merge bob
远程分支
- 本地新建的分支如果不推送到远程,对其他人就是不可见的
- 查看远程分支
git ls-remote origin,可以看到所有分支
-
对于git push分支分两种情况
-
当本地分支和远程分支一致时
git push会把所有本地分支的变更一同推送到远程,如果想只推送一个分支,使用git push origin branch-name
-
当本地分支比远程分支多时
默认git push 只推送本地和远程一致的分支, 想要把多出来的本地分支推送到远程时,使用git push origin branch-name 如果推送失败,先用git pull抓取远程的新提交
-
-
git clone的时候默认只把master分支克隆下来,如果想把所有分支都克隆下来,需要手动创建,在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称要一致
git checkout -b branch-name origin/branch-name
标签管理
- 标签类似于快照功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态。
- git checkout master 先切到master分支上
- git tag v1.0 给master打一个标签v1.0
- git show v1.0 查看标签信息
- git tag 可以查看所有的标签
- tag是针对commit来打标签的,所以可以针对历史的commit来打tag
- git log --pretty=oneline --abbrev-commit //先查看历史的commit
- git tag v0.9 46d3c1a //针对历史commit打标签
- git tag -a v0.8 -m “tag just v1.1 and so on” 5aacaf4 //可以对标签进行描述
- git tag -d v0.8 //删除标签
- git push origin v1.0 //推送指定标签到远程
- git push --tag origin //推送所有标签
- 如果本地删除了一个标签,远程也想要删除需要这样操作:
- git tag v1.0 -d //删除本地标签
- git push origin :refs/tags/v1.0 //删除远程标签
git别名
- git commit 这个命令是不是有点长? 用别名可以提高我们的工作效率
- 命令设置别名
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
- 修改文件设置别名
# vim /root/.gitconfig
[user]
name = chensslinux
email = 651795459@qq.com
name = csslinux
[alias]
ci = commit
co = checkout
- 查看git别名使用命令
git config --list |grep alias
- 查询log小技巧:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
设置上面的别名后,查看log就比较好看
[root@css03 git3]# git lg
* 3d96633 - (HEAD, origin/master, origin/chenss, master, chenss) ch 1.txt (2 小时之前) <csslinux>
|\
| * 1d47abd - add files (30 小时之前) <csslinux>
* | e7aa6ad - add files (31 小时之前) <csslinux>
|/
* c2818fe - add files (31 小时之前) <csslinux>
* c28e2a5 - (origin/dev) add files (2 天之前) <csslinux>
- 取消别名
git config --global --unset alias.br
搭建简单git服务器
github毕竟是公开的,而私有仓库又得花钱买。所以我们可以想办法搭建一个私有的,只自己公司使用的。Gitlab是个不错的选择。在介绍它之前,先讲述一下命令行的git服务器
- 找一台服务器,首先要安装git,
yum install git
- 添加git用户,并且设置shell为/usr/bin/git-shell,目的是为了不让git用户远程登陆
useradd -s /usr/bin/git-shell git
- 创建authorized_keys文件,并更改属主、属组和权限,用来存客户端机器上的公钥
cd /home/git
mkdir .ssh
touch .ssh/authorized_keys
chown -R git.git .ssh
chmod 600 .ssh/authorized_keys
- 客户机
# ssh-keygen -t rsa
把客户端上的公钥/root/.ssh/id_rsa.pub拷贝到git服务器上/home/git/.ssh/authorized_keys文件里
测试
[root@css02 ~]# ssh git@192.168.1.84
Last login: Wed Aug 12 17:29:06 2020 from 192.168.1.83
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access. 出现这个就表示成功了,说明验证成功了,只不过不允许直接登录
Connection to 192.168.1.84 closed.
- 服务端定好存储git仓库的目录,比如 /data/gitroot
mkdir /data/gitroot
cd /data/gitroot
git init --bare sample.git // 会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾
chown -R git.git sample.git
以上操作是在git服务器上做的,平时git服务器是不需要开发人员登录修改代码的,它仅仅是充当着一个服务器的角色,就像github一样,平时操作都是在我们自己的pc上做的
- 在客户端上(自己pc)克隆远程仓库
git clone git@192.168.1.84:/data/gitroot/sample.git
此时就可以在当前目录下生成一个sample的目录,这个就是我们克隆的远程仓库了。进入到这里面,可以开发一些代码,然后push到远程。
- 在本地push
git push -u origin master
搭建gitlab服务器
安装gitlab(gitlab最好不要和生产应用放在一起,最好作为独立的机器)
-
gitlab官网 https://about.gitlab.com/gitlab-com/
-
官方安装文档
- ce: https://about.gitlab.com/install/#centos-7?version=ce 社区版
- ee: https://about.gitlab.com/install/#centos-7 企业版
-
要求服务器内存不少于2g
-
配置国内源
vim /etc/yum.repos.d/gitlab.repo//加入如下内容
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
- 安装
yum install -y gitlab-ce
- gitlab-ce 13.2.4 依赖以下包
已安装:
gitlab-ce.x86_64 0:13.2.4-ce.0.el7
作为依赖被安装:
audit-libs-python.x86_64 0:2.8.5-4.el7 checkpolicy.x86_64 0:2.5-8.el7 libcgroup.x86_64 0:0.41-21.el7 libsemanage-python.x86_64 0:2.5-14.el7
policycoreutils-python.x86_64 0:2.5-34.el7 python-IPy.noarch 0:0.75-6.el7 setools-libs.x86_64 0:3.3.8-4.el7
作为依赖被升级:
audit.x86_64 0:2.8.5-4.el7 audit-libs.x86_64 0:2.8.5-4.el7 policycoreutils.x86_64 0:2.5-34.el7
- 生成配置并启动服务
gitlab-ctl reconfigure
这一步是自动完成的,它是gitlab的核心命令
- 查看监听端口
netstat -lnpt
- 启动停止重启gitlab
gitlab-ctl stop/restart/start/status
- 浏览器访问gitlab,输入ip即可
http://192.168.1.84
- 设置root密码
默认管理员root,无密码,它会让我们去定义一个密码,密码长度最少8位
- gitlab用户
可以直接注册用户
也可以登录root,添加用户
使用gitlab
-
gitlab常用命令 https://www.cnyunwei.cc/archives/1204
-
进入控制台 gitlab-rails console
[root@css03 ~]# gitlab-rails console
--------------------------------------------------------------------------------
GitLab: 13.2.4 (136d3a02dca) FOSS
GitLab Shell: 13.3.0
PostgreSQL: 11.7
--------------------------------------------------------------------------------
Loading production environment (Rails 6.0.3.1)
irb(main):001:0>
irb(main):002:0>
irb(main):003:0>
irb(main):003:0> Notify.test_email('18571518677@163.com','邮件标题','邮件正文').deliver_now() 用这条命令可以测试邮件是否通
gitlab备份恢复
- gitlab备份
gitlab-rake gitlab:backup:create
备份目录在/var/opt/gitlab/backups
- gitlab 恢复
先停服务 gitlab-ctl stop unicorn ; gitlab-ctl stop sidekiq
gitlab-rake gitlab:backup:restore BACKUP=xxxxx (这里是一个编号,即备份文件的前缀)
再启动服务 gitlab-ctl start
Gitlab 修改域名
vim /etc/gitlab/gitlab.rb
external_url 'http://192.168.1.100'
- gitlab nginx配置文件
vim /var/opt/gitlab/nginx/conf/gitlab-http.conf
- GitLab设置IP或者域名有两个配置文件:
vim /var/opt/gitlab/gitlab-rails/etc/gitlab.yml 修改这个配置文件可以邮件通知的发件人以及通知邮件里的修改密码链接的域名
vim /opt/gitlab/embedded/service/gitlab-shell/config.yml 这个配置文件怎么修改还不知道
把两个配置文件的IP或者域名修正过来即可。在GitLab-Shell的配置文件中,如果域名带端口号,也要把端口号写上。例如我的是gitlab_url: “http://gitlab.xxxx.xxxx.com:8088/”
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7zwgSuBu-1615193553153)(E373023F50454AE0A96DCD27F719BDCF)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCHK8Tyi-1615193553156)(8D0F3BB06BE0424CA5199FCABBDB5250)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SqZJRkHG-1615193553159)(3BC9A231E5DF4C4BBEA3866A5B398BE3)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PQsUVVVK-1615193553161)(A0026F265FA04682994FFA54B6ED0F16)]
- 修改后重启服务
gitlab-ctl restart