Git服务器搭建和基本使用命令

文章目录

      • Gogs
      • 安装
      • 配置
      • 启动gogs
      • git使用
      • 修改后再次提交
      • 文件的生命周期
      • git的提交
      • 增补
        • diff比较
        • HEAD
        • 检出和重置
        • 移动和删除
        • 配置本地用户名和邮箱
        • push到服务器
        • 从远程库克隆
        • 存储stash

Gogs

Go语言开发的Git服务器。开发人数少的话用来比较合适
https://gogs.io/ # 下载网址
软件依赖Centos7
yum库
访问阿里镜像站http://mirrors.aliyun.com ,找到centos,点击右边“帮助”

下载之前,可以移除原有repo文件。 找到对应CentOS对应版本的repo文件下载。

Git 安装
在linux 系统上输入
#yum install git -y
装好后需要安装MariaDB 安装
命令:# yum list | grep mariadb

安装mariadb 服务,会自动安装mairadb

#yum install mariadb-server
# systemctl start mariadb.service
# ss -tanl # 开启3306端口
开机启动
# systemctl enable mariadb.service
配置数据库
# mysql_secure_installation
数据库密码登录
# mysql -u root -p
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+

数据库环境搭建好了

安装

Gogs服务以git用户运行
下载gogs
安装程序gogsx.xx.x_amd64.tar.gz,和app.ini 通过Xsheel上传到Centos解压,产生gogs目录,里面就是gogs所有文件。
初始化数据库

$ mysql -uroot -p < scripts/mysql.sql # 其实就是创建了一个gogs的库
# 为gogs库创建mysql用户gogs,并授权
mysql> grant all on gogs.* to 'gogs'@'%' identified by 'gogs';  # 指的是gogs用户,同一网段下的用户都可以访问,密码为gogs
mysql> flush privileges; # 立即刷新

设置好之后可以通过git用户登录,查看是否只能看到两个库,是的话就代表权限设置成功

配置

参考官方文档 https://gogs.io/docs/advanced/configuration_cheat_sheet.html # 配置app.ini
配置文件 在gogs目录下建立custom/conf/app.ini配置文件

$ mkdir -p custom/conf
$ cd custom/conf
$ touch app.ini

custom/conf/app.ini内容如下

PP_NAME  = chenkeke
RUN_USER = git

RUN_MODE = dev#生产环境会改成prod
# APP_NAME = Gogs

[server]
HTTP_ADDR        = 0.0.0.0
HTTP_PORT        = 3000

[database]
B_TYPE = mysql
HOST = 127.0.0.1:3306 # 本机地址
NAME = gogs
USER = gogs
PASSWD = gogs
#DOMAIN           = 172.22.141.12X # 可以连上的地址
#ROOT_URL         = http://172.22.141.XXX:3000/
#DISABLE_SSH      = false  配置好之后会出现的
#SSH_PORT         = 22
#START_SSH_SERVER = false
#OFFLINE_MODE     = false

[security]
INSTALL_LOCK = false
SECRET_KEY = www.hao123.cm(python).GIT:gogs

注意app.ini的权限、属主、属组。此文件在配置完,它要被当前服务运行用户修改并保持。
INSTALL_LOCK之后会被变成true,就是不能看到配置页了。

启动gogs

$ ./gogs web
但是这样用不方便,使用scripts目录下的服务脚本
如果不能访问,请查看防火墙

 # systemctl status firewalld
# systemctl stop firewalld

在gogs目录下建一个log目录,否则某些gogs版本可能启动不了

2、服务启动 要在root的权限下

 # cp /home/git/gogs/scripts/systemd/gogs.service /lib/systemd/system/
# systemctl start gogs
# systemctl enable gogs
# systemctl enable mariadb
# systemctl stop firewalld
# systemctl disable firewalld

首次登录
http://设置的ip:3000/install
注意在应用基本设置上设置上自己的域名,应用url也是必须和域名一致,其他按照设置就行

在高级设置下取消登录图像的显示,可以使gogs打开网页的速度变快,或者在app.ini下禁用\gravatar.com

[picture]
DISABLE_GRAVATAR = TRUE
ENABLE_FEDERATED_AVATAR = TRUE

重新加载配置就行
也可以在访问install 的时候就直接禁用
然后点立刻安装
需要注册第一个用户,这个用户就直接成为管理员账户。
管理员可以在管理面板上查看统计数据情况
然后再新建一个用户
好了,这样一个自己搭建的Git私服已经准备好了,可以使用客户端连接推送文件了

git使用

初始化一个版本库

git init

用下载好的git的工具在windows的根目录下增加一个.git目录,不要自行修改目录里的文件
添加文件

 $ echo 'testMy Website' > index.htm
$ git add index.htm

单个文件添加 这一步是把文件的当前变化增加到索引中,也就是以后这个文件需要版本库来跟踪管理,注意这不是提交。 此时,文件还可以继续修改,还可以添加新的被跟踪文件,一定要add才能把这些改变加入到索引中

批量添加

git add.

.点号,代表当前目录,这条命令将递归添加当前目录及其子目录所有文件 只要是目录,就会递归添加该目录下的文件和子目录。

查看状态:

$  git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached ..." to unstage)
#
#   new file:   index.htm
#
# Untracked files:
#   (use "git add ..." to include in what will be committed)
#
#   .ipynb_checkpoints/
#   .python-version
#   Untitled.ipynb
#   __pycache__/
$ git status -s

-s, --short 短格式输出

Git文件分类
追踪的Tracked,已经加入版本库的文件
未追踪的Untracked,未加入到版本库的未被管理的文件
忽略的Ignored,git不再关注的文件,例如一些临时文件
在.git 下建立 .gitignore
.gitignore文件中,目录以/结尾,行起始的!是取反
.gitignore内容如下:

 *.ipynb
__pycache__/
.python-version

忽略文件不需要自己写,Python的已经有了https://github.com/github/gitignore/blob/master/Python.gitignore

$ wget -O .gitignore https://raw.githubusercontent.com/github/gitignore/master/Python.gitignore

其它语言的在这里找 https://github.com/github/gitignore
可以显示自己需要的文件,而隐藏自己没什么用的文件

提交代码有两步,一步是先add的提交到index中,然后再通过commit提交到仓库Remote里
commit 提交更改到版本库
-m 填写本次日志消息**,必须写。工作中,程序员应该对每一次提交写明做了什么改动**

修改后再次提交

以下操作均在windows下的git下进行

$ sed -i -r 's@()(.*)()@\1Welcome to \2\3@' index.htm # 正则表达式修改
$git status
$git add index.htm
$ git commit -m "Second Commit"
$git status

文件的生命周期

文件add后,就成为可跟踪文件的未修改状态unmodified,修改后,文件就变成modified(修改)状态。再次add后,将变 化提交到索引,状态变为staged,这才能提交。提交成功,文件状态从staged变回unmodified。
git log可以查看提交的版本次数

git的提交

git的提交分为两个步骤:
暂存变更:add作用是把新文件或者文件新的改动添加到一个暂存区stage,也就是加入到index中
提交变更:commit提交的是暂存区中的改动,而不是物理文件目前的改动,提交到当前分支,默认是master分支
也可以使用下面命令,将两步合成一步

git commit index.htm

如果改了一批文件,一个个写名字很麻烦,可以使用-a

git commit -a

-a,–all 会把所有跟踪的文件的改动自动暂存,然后commit。上面命令未提交message,会出现一个类似vi命令的 操作界面,需要编写message之后,才行。也可以使用下面的命令,把message信息一并填写了

$ git commit -a -m “message”

第一次提交的时候会出现的问题:

 git config --global user.name "Your Name"
 git config --global user.email [email protected]

增补

第二次提交后,忘记加入一个文件about.htm

$ touch about.htm
$ git add about.htm
$ git commit --amend # 在上一次的文件中追加修改当前提交

–amend 修改,通过创建一个新的commit来replace当前分支的顶部。
也可以在命令中继续使用-m选项直接提交message。
git log 查看一下版本库里面提交的历史记录

diff比较

git diff 查看被跟踪文件未暂存的修改,比较暂存区和工作区
git diff --cached 查看被跟踪文件暂存的修改,比较暂存区和上一次commit的差异
git diff HEAD ,查看被跟踪文件,比较工作区和上一次commit的差异。HEAD指代最后一次commit

修改之后未提交显示的是git diff 和 git diff HEAD
add 之后 出现变化的是git diff --cached 和 git diff HEAD

HEAD

HEAD可以看做是一个游标,一般是指向当前分支最后一次提交。
HEAD的值存储在.git/HEAD中。
HEAD,指代最后一次commit
HEAD^\,\指代上一次提交
HEAD^^,指代上上一次提交
上n次提交,表示为HEAD~n

检出和重置

checkout 用于切换分支,或恢复工作区文件。 注意,checkout会重写工作区,这个命令还是较为危险的。不动指针

命令 说明
git checkout 列出暂存区可以被检出的文件
git checkout file 从暂存区检出文件到工作区,就是覆盖工作区文件,可指定检出的文件。但是不清 除stage
git checkout commit file 检出某个commit的指定文件到暂存区和工作区,回滚
git checkout. 列出暂存区可以被检出的文件

git reglog(记录所有指针的变化)

$ echo > about.htm # 清除工作区文件内容
$ git checkout about.htm # 从暂存区检出到工作区,工作区文件有了内容
$ git checkout HEAD about.htm # 使用当前分支的最后一次commit检出覆盖暂存区和工作区 # 下面3条命令结果一致了 回滚
$ git diff
$ git diff --cached
$ git diff HEAD

reset 会动指针,比较危险

命令 说明
git reset 列出将被reset的文件
git reset file 重置文件的暂存区,和上一次commit一致,工作区不影响
git reset --hard 重置暂存区与工作区,与上一次commit保持一致
$ echo "Welcome about" > about.htm 
$ git add about.htm # 添加到暂存区
$ git reset about.htm # 使用最后一次提交覆盖暂存区 
$ cat about.htm # 工作区文件有内容
$ git add about.htm # 添加到暂存区
$ git reset --hard # 重置暂存区与工作区为上一次commit $ cat about.htm # 工作区文件无内容
命令 说明
git reflog 显示commit的信息,只要HEAD发生变化,就可以在这里看到
git reset commit 重置当前分支的HEAD为指定commit,同时重置暂存区,但工作区不变
git reset --hard [commit] 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定 commit一致
$ echo "Welcom about" > about.htm
$ sed -i -r 's@()(.*)()@\1\2
www.du.com\3@' index.htm $ git commit -a -m "Third Commit" [master cf914d1] Third Commit 2 files changed, 2 insertions(+), 1 deletions(-) # 重置,使用hash值只要能唯一确定一个commit就行 $ git reset --hard feccd8843 HEAD is now at feccd88 First Commit $ cat index.htm testMy Website $ git reflog feccd88 HEAD@{0}: feccd8843: updating HEAD cf914d1 HEAD@{1}: commit: Third Commit 3f330fb HEAD@{2}: commit (amend): Second commit amend 7f238b5 HEAD@{3}: commit: Second commit # 再次重置 $ git reset --hard cf914d1 $ cat index.htm testWelcome to My Website
www.du.com

移动和删除

git mv src dest 改名,直接把改名的改动放入暂存区
git rm file 会同时在版本库和工作目录中删除文件,真删除
git rm --cached file 将文件从暂存转成未暂存,从版本库中删除,但不删除工作目录的该文件,即文件恢复成不追踪的状态
以上都算是改动,必须commit才算真改动了

$ echo "Python" > python.htm
$ git add python.htm
$ git commit -m "add python

[master d2bc7d4] add python
 Committer: python 
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 python.htm
# mv
$ git mv python.htm python.py
$ git commit -m "mv python"
[master 62c16ae] mv python
 Committer: python 
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename python.htm => python.py (100%)
# 删除 git rm --cached file
$ echo "print('Hello Python')" > python.py $ git add python.py
$ git diff --cached
diff --git a/python.py b/python.py
index 46c5d2c..f80df4f 100644
--- a/python.py
+++ b/python.py
@@ -1 +1 @@
-Python
+print('Hello Python')
$ git rm --cached python.py
rm 'python.py'
$ git diff --cached
diff --git a/python.py b/python.py
deleted file mode 100644
index 46c5d2c..0000000
--- a/python.py
+++ /dev/null
@@ -1 +0,0 @@
-Python
$ git commit -m 'delete python'
[master 891c9a9] delete python
 Committer: python 
 1 files changed, 0 insertions(+), 1 deletions(-)
 delete mode 100644 python.py
# ls 看到文件还在,文件没有删除
$ ls
about.htm __pycache__ Untitled1.ipynb index.htm python.py Untitled.ipynb
# 但是文件已经变成了未跟踪的状态 $ git status
# On branch master
# Untracked files:
#   (use "git add ..." to include in what will be committed)
# python.py
nothing added to commit but untracked files present (use "git add" to track) # 文件还在,内容依然是最后修改的
$ cat python.py
print('Hello Python')
# 删除 git rm file
$ git add python.py
$ git commit -m 'add python again' [master 5a09fe9] add python again
 Committer: python 
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 python.py
$ git rm python.py
rm 'python.py'
$ git commit -m "delete python again"
[master 3a0be16] delete python again
 Committer: python 
 1 files changed, 0 insertions(+), 1 deletions(-)
 delete mode 100644 python.py
# 工作区文件没有了,真删除了
$ ls python.py
ls: cannot access python.py: No such file or directory

配置本地用户名和邮箱

$  git config --global user.name "my"
$ git config --global user.email "[email protected]"
# 这些内容对应~/.gitconfig文件,是 用户级别 的配置文件 $ cat ~/.gitconfig
[user]
    name = my
    email = [email protected]
# 命令显示
$ git config --global user.name
 $ git config --global user.email

可以通过cmd 下的.进入根目录然后查看.gitter 自己的用户名

push到服务器

本地搭建了一个github私服,模拟GitHub ,用管理员账号在私有仓库上拿到自己的http地址

关联远程版本库
git remote 列出所有远程仓库
git remote -v 详细列出所有远程仓库
git remote add [shortname] [url] 指定一个名称指向远程仓库
##git remote add origin http://[email protected]:3000/my/test.git

$git remote add origin http://[email protected]:3000/my/test.git  # IP前要加上用户名
$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = http://[email protected]:3000/my/test.git
    fetch = +refs/heads/*:refs/remotes/origin/*

远程版本库名origin,这是个习惯用法,将建立origin和后面url的映射,这些信息保存在.git/config文件的新的段 [remote “origin”] 中。

注意: http://[email protected]:3000/my/test.git XXX加上用户名,否则push会报401
git config --system 在 /etc/gitconfig 文件中读写配置
git config --global 在 ~/.gitconfig 文件中读写配置
.git/config 这个文件是 版本库级别 设置文件,这里的设置具有最高优先级

推送数据

 $git push -u origin master # 就一句
Password:
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 583 bytes, done.
Total 7 (delta 0), reused 0 (delta 0)
To http://[email protected]:3000/my/test.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
# 推送成功

输入密码就可以连接到远程仓库了!
私有的仓库,必须登录,只能用户自己看,为了方便,修改为公有的。

$ git push origin master # 指定推送到的远程主机和分支
$ git push origin # 指定当前分支推送到的主机和对应分支
$ git push -u origin master # 指定远程默认主机和分支
$ git push # simple方式,默认只推送当前分支到默认关联的远程仓库

-u 第一次远程推送的时候加上,以后就可以不使用-u参数,可以git push origin master,也可以git push都使用默 认。

$ echo "welcome about" > about.htm
$ git commit -a
Aborting commit due to empty commit message.
$ git commit -a -m "修改了about.htm" [master 6c20f48] 修改了about.htm
$ git push origin master  # 或者git push 推送过去

从远程库克隆

这一次使用git协议连接远程库。 为了演示跨平台,这里使用windows系统。 建议使用Git的windows客户端的 git bash ,它含有常用ssh命令 配置本地用户名、邮箱
根目录下的 . ssh ,
删除windows当前用户.ssh文件夹

$ ssh-keygen -t rsa -C "[email protected]"

非对称加密:公钥加密用私钥改,私钥加密公密改

$ ssh-keygen -t rsa -C "[email protected]" -t 加密算法类型
-C comment 描述信息

http协议基于tcp/lp,
ssl也是基于tcp/lp, 安全套接层 : 数据证书加密

$ ssh-keygen -t rsa -C "[email protected]" # 设置加密
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Administrator/.ssh/id_rsa): # 直接回车 Enter passphrase (empty for no passphrase): # 直接回车
Enter same passphrase again: # 直接回车
Your identification has been saved in /c/Users/Administrator/.ssh/id_rsa. # 私钥
Your public key has been saved in /c/Users/Administrator/.ssh/id_rsa.pub. # 公钥 
The key fingerprint is:
-----
$ cd
$ ls.ssh
id_rsa  id_rsa.pub # 公钥
$ pwd

```。
设置的账号登录Gogs,然后在用户设置上设置SSH 秘钥,打开公钥文件~/.ssh/id_rsa.pub,将内容贴入“密钥内容”框中,点击“增加密钥”
秘钥名称选择自己用户名,内容为公钥的粘贴
选择SSH连接远程库 在windows上找一个空目录,执行下面的克隆命令。

$ git clone [email protected]:my/test.git # 从库里拿文件出来开发
Cloning into ‘test’…
remote: Counting objects: 28, done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 28 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (28/28), done.

克隆成功。
下面就可以使用这个初始的项目文件开发了。

 注意,第一次使用ssh连接有提示,敲入yes


----

####  pycharm 中使用git
Git私服创建cmdb项目版本库,先创建一个仓库 ,获得远程仓库的地址,利用上文得到的公钥和秘钥登录,在管理仓库上添加秘钥,将公共秘钥添加上
然后就可以在pycharm 上选择git登录 把ssh地址拉下来测试一下
成功之后可以直接用pycharm打开项目
添加app.py文件,提示是否加入到git

存储stash

命令 说明
git stash 暂时存储最后一次提交后的变化,放入栈中
git stash pop 从栈中取出刚才保存的变化,并合并

在 要修复紧急bug的时候,手头上的工作还没有做完,就要用到stash
在VNC下  Stash changes
执行完,工作区回到了上次提交的样子,回到app.py中完成修改,最后提交。
然后再释放:Unstash Changes, 选择pop stash
dispatcher.py文件又变成了刚才修改过的样子,继续完成代码,提交。
应用场景
开发中,当前手中的工作没有完成,需要中断当前工作来完成其他请求,例如修复Bug。 已完成的工作内容提交不合适,可能还要需要大的调整,但是紧急请求又不能不做,就需要stash存储未完成的工 作(上次提交后做的修改)。



####  分支
项目往往是并行多人开发的,都在主分支上克隆,然后修改提交,那么主分支就会有存在大量的冲突。甚至有一些
不完善代码提交,主分支就混乱不堪,不可维护了。
再一个,如果一次提交后,需要发布一个版本,这个版本以后需要独立维护、开发,而主分支还需要继续发展,怎么办?
引入多分支
分支名在版本库中必须唯一
不能以 - 开头 可以使用/,但是不能以它结尾,被它分割的名称不能以.开头 
不能使用两个连续的.. 
不能包含任何空白字符、Git的特殊符号

####  多分枝
创建分支 需要指明从什么分支上创建什么名字的分支。版本控制的Log标签页
Master 主分枝,在pycharm 上在 Log上选择New Branch分枝
到目前就在master上拉出一个分支并切换到了这个新的分支dev上开发 修改app.py,之后提交
push到私服上看一下
合并分支
dev开发告一段落,需要将功能合并入master。 切换回到master,检出master,右键Branch'master'->checkout
开始合并,选择no fast forword vns->git->merge changes 勾选dev 勾选 No fast forward
目前的合并,只是本地,需要push到远程库 当然还可以继续检出dev分支,继续开发,开发好了,合并进来
从前面操作的图中可以看到,默认No FF不勾选的,也就是默认使用FF方式合并。

no-ff的好处是,可以看清楚开发分支上的代码改动。 上面dev分支总是开发中的代码,dev测试、审查后合并到master中。
master分支都是稳定的代码,可以发布部署。

####  GitFlow工作流
不同公司,不同的项目规模,不同的管理水平都有着不同Git工作流方式。 
最佳实践
使用Git一般至少2个分支:master和develop 
master,主干,生产环境都来主干分支上拿数据部署,也可以使用钩子自动完成
develop,开发分支,开发人员都是检出这个分支开发

辅助分支
feature 分支,具体的功能开发分支,只与 develop 分支交互。
release 分支,发布版本
hotfix 分支,紧急bug修复的版本,最后需要合并到develop 和 master中。

你可能感兴趣的:(python编程)