Git远程版本库
admin
2023-03-01 13:02:20
0

Git远程版本库

===============================================================================

概述:


===============================================================================

Git 远程版本库

1.分布式版本控制系统

基于的是网络协议

  • http,https,ssh,git

2.克隆操作

git clone

原始版本库存储在 refs/heads/

3.git 服务器

协议

  • 本地协议(local)、HTTP/HTTPS协议、SSH协议、Git协议

本地协议

URL:

  • /path/to/repo.git

  • file:///path/to/repo.git

Git协议:由git-daemon程序提供,监听在tcp的9418端口;仅支持“读”操作,无任何认证功能(支持开放式的开源项目);

URL:

  • git://host/path/to/repo.git

  • git://host/~user/path/to/repo.git

SSH协议

URL:

  • ssh://[USER@]host[:port]/path/to/repo.git

  • ssh://[USER@]host[:port]/~USERNAME/path/to/repo.git

URL2:

  • [USER@]hostpath/torepo.git

HTTP/HTTPS协议

  • 1.6.5-:哑 http 协议

  • 1.6.6+:智能 http 协议 (读/写/认证)

URL:

  • http://host/path/to/repo.git

演示1:本地协议

[root@node1 ~]# git clone file:///root/taotao/ /root/huihui
Cloning into '/root/huihui'...
remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 32 (delta 8), reused 0 (delta 0)
Receiving objects: 100% (32/32), done.
Resolving deltas: 100% (8/8), done.
[root@node1 ~]# cd /root/huihui/
[root@node1 huihui]# ls
first.sh  INSTALL  my.txt  readmin  second.sh  subdir
[root@node1 huihui]# cd .git/
[root@node1 .git]# ls
branches  config  description  HEAD  hooks  index  info  logs  objects  packed-refs  refs
[root@node1 .git]# tree refs/
refs/
├── heads
│   └── master  #实际上只clone的master分支
├── remotes   #远程跟踪分支
│   └── origin
│       └── HEAD #指向master分支
└── tags

4 directories, 2 files


[root@node1 ~]# tree /root/taotao/.git/refs/
/root/taotao/.git/refs/
├── heads
│   ├── dev
│   ├── fotfix
│   └── master
└── tags

2 directories, 3 files

引用远程版本库

1.分布式版本控制系统

远程版本库

  • 定义在配置文件中的一个实体;

  • [remote "NAME"]

由两部分组成:

  • 第一部分:URL

  • 第二部分:refspec,定义一个版本库与其他版本库的名称空间的映射关系;

语法格式:

+source:destination(本地分支和映射的目标分支)

       refs/heads/NAME:本地分支

       refs/remotes/NAME:远程跟踪分支

eg:

     [remote "publish"]

     url=http://HOST/pub/repo_name.git

     push= +refs/heads/*:refs/remotes/origin/*

显示样子:

     remote.publish.url

     remote.publish.push

 git remote  命令可管理远程仓库

git协议演示:

  1. 在node2服务器上安装git服务器,并启动服务

[root@node2~]# yum install git-daemon

[root@node1 huihui]# rpm -ql git-daemon
/usr/lib/systemd/system/git.socket    #为一个瞬时守护进程,可以直接启动
/usr/lib/systemd/system/git@.service
/usr/libexec/git-core/git-daemon
/usr/share/doc/git-daemon-1.8.3.1
/usr/share/doc/git-daemon-1.8.3.1/git-credential-cache--daemon.html
/usr/share/doc/git-daemon-1.8.3.1/git-credential-cache--daemon.txt
/usr/share/doc/git-daemon-1.8.3.1/git-daemon.html
/usr/share/doc/git-daemon-1.8.3.1/git-daemon.txt
/usr/share/man/man1/git-credential-cache--daemon.1.gz
/usr/share/man/man1/git-daemon.1.gz
/var/lib/git   #git仓库的存放位置,相当于根目录

[root@node2 ~]# cat /usr/lib/systemd/system/git@.service
[Unit]
Description=Git Repositories Server Daemon
Documentation=man:git-daemon(1)

[Service]
User=nobody                                 # 修改 --base-path 后的路径可以改变git仓库的根目录
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/git --export-all --user-path=public_git --syslog --inetd --verbose
StandardInput=socket

#启动服务,并查看tcp的端口9418
[root@node2 ~]# systemctl start git.socket
[root@node2 ~]# ss -tnl |grep 9418
LISTEN     0      128         :::9418                    :::*

2. 在nod2远程服务器上的git根目录下创建一个裸仓库,无需工作目录

[root@node2 ~]# cd /var/lib/git/
[root@node2 git]# git init --bare myproject.git
初始化空的 Git 版本库于 /var/lib/git/myproject.git/

[root@node2 git]# ls myproject.git/
branches  config  description  HEAD  hooks  info  objects  refs

3. 在node1节点克隆node2节点的远程仓库

[root@node1 ~]# git clone git://192.168.0.102/myproject.git
Cloning into 'myproject'...
warning: You appear to have cloned an empty repository.

[root@node1 myproject]# ls -a
.  ..  .git

[root@node1 myproject]# git config -l
user.name=watao
user.email=wangzhangtao@pachiratech.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=git://192.168.0.108/myproject.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

http协议演示:

1.安装httpd,确保有alias,env和cgi模块

[root@node2~]# yum install httpd

# 确保有如下3个模块
[root@node2 ~]# httpd -M |grep -Ei "\<(alias|cgi|env)"
 alias_module (shared)
 env_module (shared)
 cgi_module (shared)

2.创建裸仓库,并修改属组和属主为apache用户

[root@node2 ~]# mkdir /var/www/git
[root@node2 ~]# cd /var/www/git/
[root@node2 git]# ls
[root@node2 git]# git init --bare testproject.git
初始化空的 Git 版本库于 /var/www/git/testproject.git/

[root@node2 git]# chown -R apache.apache /var/www/git/
[root@node2 git]# ll /var/www/git/
总用量 4
drwxr-xr-x 7 apache apache 4096 11月  5 22:46 testproject.git

3.自定义虚拟主机

[root@node2 git]# vim /etc/httpd/conf/httpd.conf
注释掉 DocumentRoot "/var/www/html"

[root@node2 git]# vim /etc/httpd/conf.d/git.conf
 
         ServerName git.taotao.com
         SetEnv GIT_PROJECT_ROOT /var/www/git  #指明git根目录位置
         SetEnv GIT_HTTP_EXPORT_ALL #基于http协议导出所有功能
         ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/  #定义别名的映射路径
         
                 Options ExecCGI Indexes
                 Require all granted
         
 
 
[root@node2 git]# httpd -t
Syntax OK

4.启动httpd服务,并在node1节点克隆testproject.git仓库

[root@node2 git]# systemctl start httpd
[root@node2 git]# ss -tnl |grep 80
LISTEN     0      128         :::80                      :::* 

remote helper 是 git 执行 git clone http://.. 所需要的一个模块,而这个模块坐落在 git-core 目录里,并且这个模块的文件名叫 git-remote-http
[root@node1]# cd /usr/local/git/bin
[root@node1 bin]# ln -s  /usr/libexec/git-core/git-remote-http /usr/local/git/bin/git-remote-http
[root@node1 bin]# ln -s  /usr/libexec/git-core/git-remote-https /usr/local/git/bin/git-remote-https
[root@node1 bin]# ll
total 67600
-rwxr-xr-x 126 root root 15006529 Jul  3 22:26 git
-rwxr-xr-x   2 root root   162741 Jul  3 22:26 git-cvsserver
-rwxr-xr-x   1 root root   351673 Jul  3 22:26 gitk
-rwxr-xr-x 126 root root 15006529 Jul  3 22:26 git-receive-pack
lrwxrwxrwx   1 root root       37 Nov  5 23:29 git-remote-http -> /usr/libexec/git-core/git-remote-http
lrwxrwxrwx   1 root root       38 Nov  5 23:29 git-remote-https -> /usr/libexec/git-core/git-remote-https
-rwxr-xr-x   2 root root  8672864 Jul  3 22:26 git-shell
-rwxr-xr-x 126 root root 15006529 Jul  3 22:26 git-upload-archive
-rwxr-xr-x 126 root root 15006529 Jul  3 22:26 git-upload-pack

[root@node1 ~]# git clone http://192.168.0.108/git/testproject.git
Cloning into 'testproject'...
warning: You appear to have cloned an empty repository.


[root@node1 ~]# cd testproject/
[root@node1 testproject]# ls -a
.  ..  .git
[root@node1 testproject]# tree .git/
.git/
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

9 directories, 15 files
[root@node1 testproject]# git config -l
user.name=watao
user.email=wangzhangtao@pachiratech.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
remote.origin.url=http://192.168.0.108/git/testproject.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master

5.创建文件并上传远程版本库,发现没有权限

[root@node1 testproject]# echo "New Line" > README
[root@node1 testproject]# cat README
New Line
[root@node1 testproject]# git add README
[root@node1 testproject]# git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached ..." to unstage)

	new file:   README

[root@node1 testproject]# git commit -m "v0.1"
[master (root-commit) fb24458] v0.1
 1 file changed, 1 insertion(+)
 create mode 100644 README
[root@node1 testproject]# 
[root@node1 testproject]# 
[root@node1 testproject]# git push origin master
fatal: unable to access 'http://192.168.0.108/git/testproject.git/': The requested URL returned error: 403  #没有权限

6.要想能够做到允许用户上传操作,需要配置认证访问并开放访问权限

#在node2节点开通http.receivepack
[root@node2 testproject.git]# git config http.receivepack true
[root@node2 testproject.git]# git config -l
core.repositoryformatversion=0
core.filemode=true
core.bare=true
http.receivepack=true

#在node1节点再次上传成功
[root@node1 testproject]# git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 216 bytes | 72.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.0.108/git/testproject.git
 * [new branch]      master -> master

#在node2的远程版本库查看已经有提交对象
[root@node2 testproject.git]# ls
branches  config  description  HEAD  hooks  info  objects  refs
[root@node2 testproject.git]# cd objects/
[root@node2 objects]# ls
6b  dc  fb  info  pack
[root@node2 objects]# tree
.
├── 6b
│   └── f181e7944f75a6411a13d94762118dafbc2cff
├── dc
│   └── a7b9ab7d0a8f78dd357082f43ddd06c36533ee
├── fb
│   └── 244584596a111b649cc0ee0e4e0a554be60c68
├── info
└── pack

7.开放用户认证

[root@node2]# cd /etc/httpd/conf.d 
[root@node2 conf.d]# cat git.conf 

        ServerName git.taotao.com
	SetEnv GIT_PROJECT_ROOT /var/www/git
	SetEnv GIT_HTTP_EXPORT_ALL
	ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
	
	        Options ExecCGI Indexes
		Require all granted
	
	
	        AuthType Basic
		AuthName "Private Git Repo"
		AuthUserFile /etc/httpd/conf/.htpasswd
		Require valid-user
        


[root@node2 conf.d]# httpd -t
Syntax OK

[root@node2 ~]# systemctl restart httpd

#node1节点删除原来的目录,重新克隆
[root@node1 ~]# rm -fr testproject/
[root@node1 ~]# git clone http://192.168.0.108/git/testproject.git
Cloning into 'testproject'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
[root@node1 ~]# 
[root@node1 ~]# cd testproject/
[root@node1 testproject]# ls
README

#显示本地分支
[root@node1 testproject]# git show-branch 
[master] v0.1

#显示远程分支
[root@node1 testproject]# git show-branch -r
! [origin/HEAD] v0.1
 ! [origin/master] v0.1
--
++ [origin/HEAD] v0.1

# 新添加一行
[root@node1 testproject]# echo "second line" >> README 
[root@node1 testproject]# cat README
New Line
second line
[root@node1 testproject]# git add README
[root@node1 testproject]# git commit -m "v0.2"
[master a9bc92e] v0.2
 1 file changed, 1 insertion(+)

在远程分支node2节点创建两个用户,并在node1本地上传

[root@node2 ~]# htpasswd -c -m /etc/httpd/conf/.htpasswd tom
New password: 
Re-type new password: 
Adding password for user tom
[root@node2 ~]# htpasswd -m /etc/httpd/conf/.htpasswd jerry
New password: 
Re-type new password: 
Adding password for user jerry

[root@node2 ~]# systemctl reload httpd

#node1节点上传需要输入密码
[root@node1 testproject]# git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 254 bytes | 42.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
Username for 'http://192.168.0.108': tom
Password for 'http://tom@192.168.0.108': 
To http://192.168.0.108/git/testproject.git
   fb24458..a9bc92e  master -> master


相关内容

热门资讯

学习机直播乱象调查:主播打北大... 极目新闻记者 刘闪 何佳仪打开短视频平台,各类学习机测评直播间随处可见。一些自诩自己是“老师”的主播...
即日起,郑州“错峰加油”有优惠... 进入5月,又到了郑州臭氧污染频发的季节,记者从郑州市生态环境局移动源污染监管处了解到,为减少臭氧污染...
汗水写热爱 篮球致青春 成人组1VS1比赛。河南日报全媒体记者 黄晖 摄“非常高兴能够参加这种全民赛事,也希望以后能够有更多...
荷兰六六民主党全国办公室遭爆炸... 荷兰警方7日说,荷兰执政党之一的六六民主党位于海牙的全国办公室当晚遭爆炸物袭击,造成建筑受损,无人受...
樱花树油烟机总是开不了怎么回事 电源问题。先检查电源是否未插上或是否电,若没有,将它重新插好,等待来电后测试,检查开不了机的问题是否...
燃气灶打火后一会就灭是什么原因 原因可能是电池没有电了,所以一开始能够打着火,但是燃烧了一会儿又熄灭了,这种情况下可以尝试更换一节新...
灶盘有气儿,就是高压不打火 这种情况是点火器出了问题,如果点火器无法产生火花,那炉灶盘自然也就不能产生火,通常来说,如果灶台的开...
迅达热水器水流小怎么办 当你发现迅达热水器水流小时,可能会感到烦恼。然而,这个问题通常是很容易解决的。以下是一些可能导致水流...
迅达燃气灶打不着火 1、打火时看一下会不会有火花出来,如果没有火花就是电池没有电导致的打不着火。2、也有可能是迅达燃气灶...