代码管理

部署环境

Name Version capacity
CentOS 7 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux  
svn subversion.x86_64 0:1.7.14-14.el7  
git git.x86_64 0:1.8.3.1-14.el7_5 4.6 M
gitlab gitlab-ce.x86_64 0:11.2.1-ce.0.el7 426 M

 

代码管理常识

版本控制,记录若干文件内容变化,以便将来查阅特定版本修订情况

版本管理工具发展简史,cvs => svn => git 参考

http://luckypoem14.github.io/test/2012/04/24/scm-history/

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 install -y subversion

创建版本库,新建目录,创建

# mkdir -p /data/svnroot/myproject
# ls -la !$
ls -la /data/svnroot/myproject
总用量 0
drwxr-xr-x 2 root root  6 8月  28 20:36 .
drwxr-xr-x 3 root root 23 8月  28 20:36 ..
# svnadmin create /data/svnroot/myproject
# ls -la /data/svnroot/myproject
总用量 8
drwxr-xr-x 6 root root  86 8月  28 20:37 .
drwxr-xr-x 3 root root  23 8月  28 20:36 ..
drwxr-xr-x 2 root root  54 8月  28 20:37 conf
drwxr-sr-x 6 root root 233 8月  28 20:37 db
-r--r--r-- 1 root root   2 8月  28 20:37 format
drwxr-xr-x 2 root root 231 8月  28 20:37 hooks
drwxr-xr-x 2 root root  41 8月  28 20:37 locks
-rw-r--r-- 1 root root 229 8月  28 20:37 README.txt
# cd !$/conf
cd /data/svnroot/myproject/conf
# ls
authz  passwd  svnserve.conf

authz为权限配置文件,passwd为密码文件,svnserve.conf仓库配置文件。

配置权限文件authz

# vim authz
...
[groups]
​
admins = zyshan,user1
​
[/]
@admins = rw
*=r
​
[myproject:/]
user1=rw

括号根[/]代表前面创建的/data/svnroot/myproject目录,@后面指用户组的权限,*除用户组外的权限,[myproject:/]即/data/svnroot/myproject目录下的子目录(myproject可以根据svnroot目录下的兄弟项目设置兄弟目录。

配置密码文件

# vim passwd
​
[users]
zyshan = zyshan!(*$123
user1 = user1_^^^123
user2 = user2-***123

前面用户,后面对应密码

配置仓库文件

# vim svnserve.conf
​
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = /data/svnroot/

anon-access = none匿名用户没有权限,auth-access组用户有写权限,密码和权限文件在当前相对目录,项目生效realm = /data/svnroot/是绝对目录。

启动svn

# svnserve -d -r /data/svnroot
​
# ps aux |grep svnserve
root      2001  0.0  0.0 162240   660 ?        Ss   21:20   0:00 svnserve -d -r /data/svnroot
root      2003  0.0  0.0 112720   972 pts/0    R+   21:20   0:00 grep --color=auto svnserve
# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State            
tcp        0      0 0.0.0.0:3690            0.0.0.0:*               LISTEN      2001/svnserve

 

客户端上使用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服务器端不是简单将上传的文件一个一个存放起来的;SVN服务器端默认采用的FSFS格式是将每次commit的内容增量方式存放的,每个增量包存成1个文件,这个增量包中包括了这次commit的全部数据。也就是说你不可能在服务器端存放该版本库的文件夹下找到你上传的某个文件​,因为SVN在服务器端的存储方式和客户端是不一样的,所以在服务器端是看不到源文件的。服务器端有两种存储方式FSFS和BDB,目前默认都是FSFS。

 

客户端使用svn(windows)

官网 https://tortoisesvn.net/index.zh.html

下载TortoiseSVN 并安装 简明教程 http://www.jianshu.com/p/6b3b7b915332

 

单机上使用git

安装git

# yum install -y git

创建项目仓库,进入仓库,初始化仓库

# mkdir /data/gitroot
# cd !$
cd /data/gitroot
# git init
初始化空的 Git 版本库于 /data/gitroot/.git/

新建代码文件,并输入代码;把代码文件添加到仓库,add完还要commit才算真正把代码文件提交到git仓库

# vi 1.txt
[root@zyshanlinux-001 gitroot]# git add 1.txt
# git commit -m "add 1.txt"
​
*** Please tell me who you are.
​
Run
​
  git config --global user.email "[email protected]"
  git config --global user.name "Your Name"
​
to set your account's default identity.
Omit --global to set the identity only in this repository.
​
fatal: unable to auto-detect email address (got 'root@zyshanlinux-001.(none)')

提交仓库,提示要设置邮箱和用户名,按提示执行指定的2条命令并更改自己的信息。这些配置信息会存到/root/.gitconfig文件中

# git config --global user.email "[email protected]"
# git config --global user.name "zyshan"
# cat /root/.gitconfig
[user]
    email = [email protected]
    name = zyshan
[root@zyshanlinux-001 gitroot]# git commit -m "add 1.txt"
1 file changed, 6 insertions(+)
 create mode 100644 1.txt

修改了代码,但没add也没commit,可以查看当前的状态,会提示你应该怎么提交到仓库。

[root@zyshanlinux-001 gitroot]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add ..." 更新要提交的内容)
#   (使用 "git checkout -- ..." 丢弃工作区的改动)
#
#   修改:      1.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

与仓库里面的版本比较修改代码的内容。

# git diff 1.txt 
diff --git a/1.txt b/1.txt
index 6cfe858..5b48106 100644
--- a/1.txt
+++ b/1.txt
@@ -4,3 +4,4 @@ jfdifjd
 sss
 adf
 f`111111111111111111111
+222222222222

多增加和修改几次代码,可以查看提交记录

# git log
commit 55ecc941db7ef80758e71f87b051799bdeac0a56
Author: zyshan 
Date:   Wed Aug 29 08:51:39 2018 +0800
​
    add 1.txt agin
​
commit 23a0a28acdbfaebcdfff5dd5c97789878d6d306d
Author: zyshan 
Date:   Wed Aug 29 08:50:43 2018 +0800
​
    ch 1.txt agin
​
commit bc3deea058beb6b0b9700710580be941a852addd
Author: zyshan 
Date:   Wed Aug 29 08:45:20 2018 +0800
​
    add 1.txt

简化显示

# git log --pretty=oneline
55ecc941db7ef80758e71f87b051799bdeac0a56 add 1.txt agin
23a0a28acdbfaebcdfff5dd5c97789878d6d306d ch 1.txt agin
bc3deea058beb6b0b9700710580be941a852addd add 1.txt

回滚版本,在hard后面添加上面的IP字符串简写就可以了

# git reset --hard 23a0a
HEAD 现在位于 23a0a28 ch 1.txt agin
# git log --pretty=oneline
23a0a28acdbfaebcdfff5dd5c97789878d6d306d ch 1.txt agin
bc3deea058beb6b0b9700710580be941a852addd add 1.txt

撤销修改,删除代码文件恢复;如果记住IP可以直接恢复到指定IP版本

# rm -fv 1.txt 
已删除"1.txt"
# git checkout -- 1.txt
# ls
1.txt

修改了代码文件,add后没有commit,向回退到上次提交的状态

# git reset HEAD 1.txt 
重置后撤出暂存区的变更:
M   1.txt
# git checkout -- 1.txt

查看历史版本,即使删除了代码文件,也可以在这查看代码文件的IP后恢复

# git reflog
23a0a28 HEAD@{0}: reset: moving to 23a0a
55ecc94 HEAD@{1}: commit: add 1.txt agin
23a0a28 HEAD@{2}: commit: ch 1.txt agin
bc3deea HEAD@{3}: commit (initial): add 1.txt

删除代码文件,但仍然可以按上面的方法恢复

# git rm 1.txt 
rm '1.txt'
# ls
# git commit -m "rm 1.txt"
[master 58b2eb5] rm 1.txt
 1 file changed, 8 deletions(-)
 delete mode 100644 1.txt
# git checkout -- 1.txt
error: pathspec '1.txt' did not match any file(s) known to git.

上面命令括号里面的add、ch、rm都是注释,方便查看各版本的区别

 

建立远程仓库

首先到 https://github.com 注册一个账号,创建自己的git,点repositories 再点new

 

名字自定义,比如叫studygit 选择public 点 create repository

添加key:右上角点自己头像,选择settings,左侧选择SSH and GPG keys

左侧点New SSH key,把linux机器上的~/.ssh/id_rsa.pub内容粘贴到这里

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
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.
The key fingerprint is:
SHA256:kBk4bFtFYE/lep7nMER5xMsuIzc7gAERune/keCNVJ4 root@zyshanlinux-001
The key's randomart image is:
+---[RSA 2048]----+
|   .o++++....    |
|   .*..* . o.    |
|  .. =+ o +...   |
|   .. .+ + .o    |
|  . . +oE o.     |
|   . +.=o==..    |
|      o =+==.    |
|         oo=     |
|        .  ..    |
+----[SHA256]-----+
[root@zyshanlinux-001 ~]# cat .ssh/id_rsa.pub 
~~此处省略~~

把本地仓库推送到远程仓库,这一步是在远程创建一个新的仓库gittest,名字尽量和本地的一致

# cd /tmp
# mkdir gittest
# cd gittest/
# echo "# gittest" >> README.md
# git init
初始化空的 Git 版本库于 /tmp/gittest/.git/
# ls -la
总用量 8
drwxr-xr-x   3 root root   35 8月  29 09:51 .
drwxrwxrwt. 12 root root 4096 8月  29 09:51 ..
drwxr-xr-x   7 root root  119 8月  29 09:51 .git
-rw-r--r--   1 root root   10 8月  29 09:51 README.md
# git add README.md 
# git commit -m "test01"
[master(根提交) a39e3f9] test01
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

然后把本地的gittest仓库推送到远程的gittest,初次推送需要输入github的账户密码

# git remote add origin https://github.com/zhengyshan/gittest.git
# git push -u origin master
Username for 'https://github.com': 
Password for 'https://[email protected]': 
Counting objects: 3, done.
Writing objects: 100% (3/3), 214 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/zhengyshan/gittest.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。

下一次再推送,就可以直接 git push,但要设置push.default,否则继续输入账户密码

# vi test.txt
# git add test.txt ;git commit -m "add test.txt"
[master 092b56a] add test.txt
 1 file changed, 5 insertions(+)
 create mode 100644 test.txt
# git push
warning: push.default 未设置,它的默认值将会在 Git 2.0 由 'matching'
修改为 'simple'。若要不再显示本信息并在其默认值改变后维持当前使用习惯,
进行如下设置:
​
  git config --global push.default matching
​
若要不再显示本信息并从现在开始采用新的使用习惯,设置:
​
  git config --global push.default simple
​
参见 'git help config' 并查找 'push.default' 以获取更多信息。
('simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,
为保持兼容,请用 'current' 代替 'simple' 模式)
​
Username for 'https://github.com': zhengyshan                                                    Password for 'https://[email protected]': 
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 288 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/zhengyshan/gittest.git
   a39e3f9..092b56a  master -> master

 

克隆远程仓库

# cd /home
# git clone [email protected]:aminglinux/lanmp.git
正克隆到 'lanmp'...
The authenticity of host 'github.com (52.74.223.119)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5: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,52.74.223.119' (RSA) to the list of known hosts.
remote: Counting objects: 32, done.
remote: Total 32 (delta 0), reused 0 (delta 0), pack-reused 32
接收对象中: 100% (32/32), 5.99 KiB | 0 bytes/s, done.
处理 delta 中: 100% (6/6), done.
# cd lanmp/
# ls
lanmp.sh  README.md
# vi README.md 
# git add README.md ;git commit -m "add README.md"
[master 761fe18] add README.md
 1 file changed, 1 insertion(+), 6 deletions(-)

可以把远程的别人公开的仓库克隆到本地,如果想放到自己的远程仓库,可以新建一个项目

git push是推送;git pull是拉取。

 

本地分支管理

查看分支

# cd /data/gitroot/
# git branch
* master

创建分支

# git branch zyshan
# git branch
* master
  zyshan

切换到了新的分支下

# git checkout zyshan
切换到分支 'zyshan'
[root@zyshanlinux-001 gitroot]# git branch
  master
* zyshan

再用git branch查看,会看到有两个分支master和zyshan,当前使用的分支前面会有一个*在zyshan分支下 ,编辑2.txt,并提交到新分支

# echo "333" > 2.txt
# git add 2.txt
# git commit -m "666333"
[zyshan 742dad6] 666333
 2 files changed, 2 insertions(+), 8 deletions(-)
 create mode 100644 2.txt

切换回master分支,此时cat 2.txt发现并没有该文件

# git checkout master
切换到分支 'master'
# cat 2.txt
cat: 2.txt: 没有那个文件或目录

合并分支之前,先切换到目标分支 ,把zyshan分支合并到了master

# git merge zyshan
更新 55ecc94..742dad6
Fast-forward
 1.txt | 9 +--------
 2.txt | 1 +
 2 files changed, 2 insertions(+), 8 deletions(-)
 create mode 100644 2.txt

如果master分支和zyshan分支都对2.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。 解决冲突的方法是在master分支下,编辑2.txt,改为zyshan分支里面2.txt的内容。 然后提交2.txt,再合并zyshan分支。但是这样有一个问题,万一master分支更改的内容是我们想要的呢? 可以编辑2.txt内容,改为想要的,然后提交。切换到zyshan分支,然后合并master分支到zyshan分支即可(倒着合并)。合并分支有一个原则,那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。

删除分支

# git branch -d zyshan
已删除分支 zyshan(曾为 25def92)。

如果分支没有合并,删除之前会提示,那就不合并,强制删除 git branch -D aming

 

使用分支的原则

对于分支的应用,建议大家以这样的原则来: master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。 创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master 开发人员应该在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支

dev分支合并bob分支的命令是: git checkout dev //先切换到dev分支,然后 git merge bob

 

远程分支管理

本地新建的分支如果不推送到远程,对其他人就是不可见的

在本地查看远程分支 git ls-remote origin,可以看到所有分支

# git ls-remote origin
092b56a3c1642b7d3099ad0c4247862ce79c46bc    HEAD
65364aaeb031c3bbf60b455e0d9c5d3b2580f1f9    refs/heads/dev
092b56a3c1642b7d3099ad0c4247862ce79c46bc    refs/heads/master

git clone的时候默认只把master分支克隆下来,如果想把所有分支都克隆下来,需要手动创建,在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称要一致

# git clone https://github.com/zhengyshan/gittest.git
正克隆到 'gittest'...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 12 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (12/12), done.
# git branch
* master
# git checkout -b dev origin/dev
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
# git branch
* dev
  master

对于git push分支分两种情况当本地分支和远程分支一致时git push会把所有本地分支的变更一同推送到远程,如果想只推送一个分支,使用git push origin branch-name

# vi linux.doc 
# git add linux.doc 
# git commit -m "ch linux.doc"
[dev b4f3ded] ch linux.doc
 1 file changed, 1 insertion(+)
# git push
warning: push.default 未设置,它的默认值将会在 Git 2.0 由 'matching'
修改为 'simple'。若要不再显示本信息并在其默认值改变后维持当前使用习惯,
进行如下设置:
​
  git config --global push.default matching
​
若要不再显示本信息并从现在开始采用新的使用习惯,设置:
​
  git config --global push.default simple
​
参见 'git help config' 并查找 'push.default' 以获取更多信息。
('simple' 模式由 Git 1.7.11 版本引入。如果您有时要使用老版本的 Git,
为保持兼容,请用 'current' 代替 'simple' 模式)
​
Username for 'https://github.com': zhengyshan
Password for 'https://[email protected]': 
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 311 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/zhengyshan/gittest.git
   65364aa..b4f3ded  dev -> dev
# git push origin dev
Username for 'https://github.com': zhengyshan
Password for 'https://[email protected]': 
Everything up-to-date

当本地分支比远程分支多,默认git push 只推送本地和远程一致的分支,想要把多出来的本地分支推送到远程时,使用git push origin branch-name 如果推送失败,先用gt pull抓取远程的新提交

# git branch dev2
# git branch
* dev
  dev2
  master
# git checkout dev2
切换到分支 'dev2'
# git branch
  dev
* dev2
  master
# vi 6.txt
# git add 6.txt 
# git commit -m "fjdfj"
[dev2 5fffc80] fjdfj
 1 file changed, 2 insertions(+)
 create mode 100644 6.txt
# git push origin dev2
Username for 'https://github.com': zhengyshan
Password for 'https://[email protected]': 
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 334 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/zhengyshan/gittest.git
 * [new branch]      dev2 -> dev2

标签管理

标签类似于快照功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态。 先切到master分支上

# git checkout master
切换到分支 'master'
# git branch
  dev
  dev2
* master

给master打一个标签v1.0

# git tag v1.0

查看标签信息

# git show v1.0
commit 092b56a3c1642b7d3099ad0c4247862ce79c46bc
Author: zyshan 
Date:   Wed Aug 29 10:15:50 2018 +0800
​
    add test.txt
​
diff --git a/test.txt b/test.txt
new file mode 100644
index 0000000..810b67a
--- /dev/null
+++ b/test.txt
@@ -0,0 +1,5 @@
+#test
+111111111111
+22222222
+aaaaaaaaaaaa
+

可以查看所有的标签

# git tag
v1.0

tag是针对commit来打标签的,所以可以针对历史的commit来打tag

先查看历史的commit

# git log --pretty=oneline --abbrev-commit
092b56a add test.txt
a39e3f9 test01

针对历史commit打标签

# git tag v0.7 a39e
# git tag
v0.7
v1.0

可以对标签进行描述

# git tag -a v0.6 -m "tag just v1.1 and so on" bb58841
[root@zyshanlinux-001 gittest]# git tag
v0.6
v0.7
v1.0

推送指定标签到远程

# git push origin v1.0
Username for 'https://github.com': zhengyshan
Password for 'https://[email protected]': 
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/zhengyshan/gittest.git
 * [new tag]         v1.0 -> v1.0

推送所有标签

# git push --tag origin
Username for 'https://github.com': zhengyshan
Password for 'https://[email protected]': 
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/zhengyshan/gittest.git
 * [new tag]         v0.7 -> v0.7

如果本地删除了一个标签,远程也想要删除需要这样操作:删除本地标签

# git tag v1.0 -d
已删除 tag 'v1.0'(曾为 092b56a)

删除远程标签

# git push origin :refs/tags/v1.0
Username for 'https://github.com': zhengyshan
Password for 'https://[email protected]': 
To https://github.com/zhengyshan/gittest.git
 - [deleted]         v1.0

 

git别名

git commit 这个命令是不是有点长? 用别名可以提高我们的工作效率 git config --global alias.ci commit git config --global alias.co checkout git config --global alias.br branch

# git branch
  dev
  dev2
* master
# git config --global alias.br  branch
# git br
  dev
  dev2
* master

查看git别名使用命令

# git config --list |grep alias
alias.br=branch

查询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"
# git lg
* bb58841 - (HEAD, master) add unix.txt (27 分钟之前) 
* 092b56a - (origin/master, origin/HEAD) add test.txt (8 小时之前) 
* a39e3f9 - (tag: v0.7) test01 (8 小时之前) 
# cat /root/.gitconfig 
[user]
    email = [email protected]
    name = zyshan
[push]
        default = matching
[alias]
    br = branch
    lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

显示效果

取消别名

# git config --global --unset alias.br
# git br
git:'br' 不是一个 git 命令。参见 'git --help'。
​
您指的是这其中的某一个么?
    branch
    var
# git branch
  dev
  dev2
* master

 

搭建git服务器

github毕竟是公开的,而私有仓库又得花钱买。所以我们可以想办法搭建一个私有的,只自己公司使用的。Gitlab是个不错的选择。在介绍它之前,先讲述一下命令行的git服务器 找一台服务器,首先要安装git,yum install git

# yum install -y git

添加git用户,并且设置shell为/usr/bin/git-shell,目的是为了不让git用户远程登陆

# useradd -s /usr/bin/git-shell git
# cd /home/git
# ls

创建authorized_keys文件,并更改属主、属组和权限,用来存客户端机器上的公钥

# mkdir .ssh
# touch .ssh/authorized_keys
# chmod 600 .ssh/authorized_keys
# chown -R git.git .ssh

要把客户端上的公钥放到git服务器上/home/git/.ssh/authorized_keys文件里

# vi .ssh/authorized_keys

定好存储git仓库的目录,比如 /data/gitroot

# mkdir /data/gitroot
# cd /data/gitroot

git init --bare sample.git // 会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾

# git init --bare sample.git
初始化空的 Git 版本库于 /data/gitroot/sample.git/

赋予权限

# chown -R git.git sample.git

以上操作是在git服务器上做的,平时git服务器是不需要开发人员登录修改代码的,它仅仅是充当着一个服务器的角色,就像github一样,平时操作都是在我们自己的pc上做的

在客户端上(自己pc)克隆远程仓库 git clone git@ip:/data/gitroot/sample.git

# ssh [email protected]
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to 192.168.106.130 closed.
# git clone [email protected]:/data/gitroot/sample.git
正克隆到 'sample'...
warning: 您似乎克隆了一个空版本库。
# cd sample/
# ls
# cp /etc/init.d/mysqld .
# ls
mysqld
# git add .
# git commit -m "add new file"
[master(根提交) b6bdf2c] add new file
 1 file changed, 390 insertions(+)
 create mode 100755 mysqld

此时就可以在当前目录下生成一个sample的目录,这个就是我们克隆的远程仓库了。进入到这里面,可以开发一些代码,然后push到远程。

# git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: 无法推送一些引用到 '[email protected]:/data/gitroot/sample.git'
# git push origin master
Counting objects: 3, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 3.88 KiB | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/data/gitroot/sample.git
 * [new branch]      master -> master

由于客户端的仓库是一个空白的仓库,所以第一次推送分支需要指定分支,否则无法推送

修改代码推送测试,不用指定分支了

# echo "555" > 222.txt
# git add 222.txt
# git commit -m "add 222.txt"
[master d52bd5f] add 222.txt
 1 file changed, 1 insertion(+)
 create mode 100644 222.txt
# git push
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 275 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/data/gitroot/sample.git
   b6bdf2c..d52bd5f  master -> master

到另一个目录克隆仓库,修改代码文件后,回到原来的目录,测试拉取代码(模拟多台客户端推送拉取代码文件),测试成功

# cd /tmp/
# git clone [email protected]:/data/gitroot/sample.git
正克隆到 'sample'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
接收对象中: 100% (6/6), 4.12 KiB | 0 bytes/s, done.
# ls sample/
222.txt  mysqld
# cd sample/
# vi 222.txt 
# git add 222.txt 
# git commit -m "ch 222.txt"
[master c8f165c] ch 222.txt
 1 file changed, 1 insertion(+)
# git push
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 279 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:/data/gitroot/sample.git
   d52bd5f..c8f165c  master -> master
# cd /root/sample/
# ls
222.txt  mysqld
# git pull
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
来自 192.168.106.130:/data/gitroot/sample
   d52bd5f..c8f165c  master     -> origin/master
更新 d52bd5f..c8f165c
Fast-forward
 222.txt | 1 +
 1 file changed, 1 insertion(+)
# cat 222.txt 
555
666

 

使用gitlab

gitlab官网 https://about.gitlab.com/gitlab-com/

官方安装文档 https://about.gitlab.com/installation/?version=ce#centos-7 (ce/ee)

要求服务器内存不少于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

安裝gitlab

# yum install -y gitlab-ce

配置低的话这步会花费比较久

# gitlab-ctl reconfigure

netstat -lnpt //查看监听端口

gitlab-ctl stop/restart/start/status

浏览器访问gitlab,输入ip即可

默认管理员root,无密码,它会让我们去定义一个密码

gitlab常用命令 https://www.cnyunwei.cc/archives/1204

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

 

 


扩展:

同学分享的svn文档 http://note.youdao.com/noteshare?id=1bb87a28a2973ae5722bf765882c2d8f

svn 多仓库管理 http://elim.iteye.com/blog/1171108

svn+ssh http://www.linuxfly.org/post/450/

svn清除保存的用户名和密码 http://holy2010.blog.51cto.com/1086044/645944

svn命令详解 http://blog.sina.com.cn/s/blog_963453200101eiuq.html

svn的钩子 http://coolnull.com/1716.html

gitlab修改端口 http://blog.csdn.net/arybd/article/details/54635295

修改主机名 http://www.mamicode.com/info-detail-1316828.html

第三方邮件 http://blog.csdn.net/liuruiqun/article/details/50000213

server ssh 端口并不是22 http://www.cnblogs.com/limx/p/5709101.html http://www.linuxidc.com/Linux/2017-02/141043.htm

应该修改 /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

# If you use non-standard ssh port you need to specify it

ssh_port: xxxxx

gitlab的钩子相关配置 http://fighter.blog.51cto.com/1318618/1670667

你可能感兴趣的:(linux)