千家信息网

Git远程版本库

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,Git远程版本库===============================================================================概述:==========
千家信息网最后更新 2025年01月31日Git远程版本库

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/huihuiCloning 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]# lsfirst.sh  INSTALL  my.txt  readmin  second.sh  subdir[root@node1 huihui]# cd .git/[root@node1 .git]# lsbranches  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分支└── tags4 directories, 2 files[root@node1 ~]# tree /root/taotao/.git/refs//root/taotao/.git/refs/├── heads│   ├── dev│   ├── fotfix│   └── master└── tags2 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 DaemonDocumentation=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 --verboseStandardInput=socket#启动服务,并查看tcp的端口9418[root@node2 ~]# systemctl start git.socket[root@node2 ~]# ss -tnl |grep 9418LISTEN     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.gitCloning into 'myproject'...warning: You appear to have cloned an empty repository.[root@node1 myproject]# ls -a.  ..  .git[root@node1 myproject]# git config -luser.name=wataouser.email=wangzhangtao@pachiratech.comcore.repositoryformatversion=0core.filemode=truecore.bare=falsecore.logallrefupdates=trueremote.origin.url=git://192.168.0.108/myproject.gitremote.origin.fetch=+refs/heads/*:refs/remotes/origin/*branch.master.remote=originbranch.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/总用量 4drwxr-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 -tSyntax OK

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

[root@node2 git]# systemctl start httpd[root@node2 git]# ss -tnl |grep 80LISTEN     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]# lltotal 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-packlrwxrwxrwx   1 root root       37 Nov  5 23:29 git-remote-http -> /usr/libexec/git-core/git-remote-httplrwxrwxrwx   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.gitCloning 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    └── tags9 directories, 15 files[root@node1 testproject]# git config -luser.name=wataouser.email=wangzhangtao@pachiratech.comcore.repositoryformatversion=0core.filemode=truecore.bare=falsecore.logallrefupdates=trueremote.origin.url=http://192.168.0.108/git/testproject.gitremote.origin.fetch=+refs/heads/*:refs/remotes/origin/*branch.master.remote=originbranch.master.merge=refs/heads/master

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

[root@node1 testproject]# echo "New Line" > README[root@node1 testproject]# cat READMENew Line[root@node1 testproject]# git add README[root@node1 testproject]# git statusOn branch masterNo commits yetChanges 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 masterfatal: 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 -lcore.repositoryformatversion=0core.filemode=truecore.bare=truehttp.receivepack=true#在node1节点再次上传成功[root@node1 testproject]# git push origin masterEnumerating 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]# lsbranches  config  description  HEAD  hooks  info  objects  refs[root@node2 testproject.git]# cd objects/[root@node2 objects]# ls6b  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 -tSyntax OK[root@node2 ~]# systemctl restart httpd#node1节点删除原来的目录,重新克隆[root@node1 ~]# rm -fr testproject/[root@node1 ~]# git clone http://192.168.0.108/git/testproject.gitCloning 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]# lsREADME#显示本地分支[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 READMENew Linesecond 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 tomNew password: Re-type new password: Adding password for user tom[root@node2 ~]# htpasswd -m /etc/httpd/conf/.htpasswd jerryNew password: Re-type new password: Adding password for user jerry[root@node2 ~]# systemctl reload httpd#node1节点上传需要输入密码[root@node1 testproject]# git push origin masterEnumerating 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': tomPassword for 'http://tom@192.168.0.108': To http://192.168.0.108/git/testproject.git   fb24458..a9bc92e  master -> master


0