【Git】本地git服务器搭建_git本地服务器搭建-程序员宅基地

技术标签: github  git  Linux环境高级编程  运维  git本地服务器  服务器  git服务器  gitee  

00. 目录

01. 概述

在这里插入图片描述

到目前为止已经有办法使用 Git 来完成日常工作。 然而,为了使用 Git 协作功能,你还需要有远程的 Git 仓库。 尽管在技术上可以从个人仓库进行推送(push)和拉取(pull)来修改内容,但不鼓励使用这种方法,因为一不留心就很容易弄混其他人的进度。 此外,你希望你的合作者们即使在你的电脑未联机时亦能存取仓库 — 拥有一个更可靠的公用仓库十分有用。 因此,与他人合作的最佳方法即是建立一个你与合作者们都有权利访问,且可从那里推送和拉取资料的共用仓库。

架设一台 Git 服务器并不难。 首先,选择你希望服务器使用的通讯协议。 在本章将介绍可用的协议以及各自优缺点。 下面一节将解释使用那些协议的典型设置及如何在你的服务器上运行。 最后,如果你不介意托管你的代码在其他人的服务器,且不想经历设置与维护自己服务器的麻烦,可以试试我们介绍的几个仓库托管服务。

一个远程仓库通常只是一个裸仓库(bare repository)——即一个没有当前工作目录的仓库。 因为该仓库仅仅作为合作媒介,不需要从磁盘检查快照;存放的只有 Git 的资料。 简单的说,裸仓库就是你工程目录内的 .git 子目录内容,不包含其他资料。

02. 协议

Git 可以使用四种不同的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议。 在此,我们将会讨论那些协议及哪些情形应该使用(或避免使用)他们。

2.1 本地协议

最基本的就是 本地协议(Local protocol) ,其中的远程版本库就是同一主机上的另一个目录。 这常见于团队每一个成员都对一个共享的文件系统(例如一个挂载的 NFS)拥有访问权,或者比较少见的多人共用同一台电脑的情况。 后者并不理想,因为你的所有代码版本库如果长存于同一台电脑,更可能发生灾难性的损失。

如果你使用共享文件系统,就可以从本地版本库克隆(clone)、推送(push)以及拉取(pull)。 像这样去克隆一个版本库或者增加一个远程到现有的项目中,使用版本库路径作为 URL。 例如,克隆一个本地版本库,可以执行如下的命令:

$ git clone /srv/git/project.git

或者

$ git clone file:///srv/git/project.git

如果在 URL 开头明确的指定 file://,那么 Git 的行为会略有不同。 如果仅是指定路径,Git 会尝试使用硬链接(hard link)或直接复制所需要的文件。 如果指定 file://,Git 会触发平时用于网路传输资料的进程,那样传输效率会更低。 指定 file:// 的主要目的是取得一个没有外部参考(extraneous references) 或对象(object)的干净版本库副本——通常是在从其他版本控制系统导入后或一些类似情况需要这么做 。 在此我们将使用普通路径,因为这样通常更快。

要增加一个本地版本库到现有的 Git 项目,可以执行如下的命令:

$ git remote add local_proj /srv/git/project.git

然后,就可以通过新的远程仓库名 local_proj 像在网络上一样从远端版本库推送和拉取更新了。

优点

基于文件系统的版本库的优点是简单,并且直接使用了现有的文件权限和网络访问权限。 如果你的团队已经有共享文件系统,建立版本库会十分容易。 只需要像设置其他共享目录一样,把一个裸版本库的副本放到大家都可以访问的路径,并设置好读/写的权限,就可以了, 我们会在 在服务器上搭建 Git 讨论如何导出一个裸版本库。

这也是快速从别人的工作目录中拉取更新的方法。 如果你和别人一起合作一个项目,他想让你从版本库中拉取更新时,运行类似 git pull /home/john/project 的命令比推送到服务器再抓取回来简单多了。

缺点

这种方法的缺点是,通常共享文件系统比较难配置,并且比起基本的网络连接访问,这不方便从多个位置访问。 如果你想从家里推送内容,必须先挂载一个远程磁盘,相比网络连接的访问方式,配置不方便,速度也慢。

值得一提的是,如果你使用的是类似于共享挂载的文件系统时,这个方法不一定是最快的。 访问本地版本库的速度与你访问数据的速度是一样的。 在同一个服务器上,如果允许 Git 访问本地硬盘,一般的通过 NFS 访问版本库要比通过 SSH 访问慢。

最终,这个协议并不保护仓库避免意外的损坏。 每一个用户都有“远程”目录的完整 shell 权限,没有方法可以阻止他们修改或删除 Git 内部文件和损坏仓库。

2.2 HTTP 协议

Git 通过 HTTP 通信有两种模式。 在 Git 1.6.6 版本之前只有一个方式可用,十分简单并且通常是只读模式的。 Git 1.6.6 版本引入了一种新的、更智能的协议,让 Git 可以像通过 SSH 那样智能的协商和传输数据。 之后几年,这个新的 HTTP 协议因为其简单、智能变的十分流行。 新版本的 HTTP 协议一般被称为 智能 HTTP 协议,旧版本的一般被称为 HTTP 协议。 我们先了解一下新的智能 HTTP 协议。

智能 HTTP 协议

智能 HTTP 的运行方式和 SSH 及 Git 协议类似,只是运行在标准的 HTTP/S 端口上并且可以使用各种 HTTP 验证机制, 这意味着使用起来会比 SSH 协议简单的多,比如可以使用 HTTP 协议的用户名/密码授权,免去设置 SSH 公钥。

智能 HTTP 协议或许已经是最流行的使用 Git 的方式了,它即支持像 git:// 协议一样设置匿名服务, 也可以像 SSH 协议一样提供传输时的授权和加密。 而且只用一个 URL 就可以都做到,省去了为不同的需求设置不同的 URL。 如果你要推送到一个需要授权的服务器上(一般来讲都需要),服务器会提示你输入用户名和密码。 从服务器获取数据时也一样。

事实上,类似 GitHub 的服务,你在网页上看到的 URL(比如 https://github.com/schacon/simplegit), 和你在克隆、推送(如果你有权限)时使用的是一样的。

哑(Dumb)HTTP协议

如果服务器没有提供智能 HTTP 协议的服务,Git 客户端会尝试使用更简单的“哑” HTTP 协议。 哑 HTTP 协议里 web 服务器仅把裸版本库当作普通文件来对待,提供文件服务。 哑 HTTP 协议的优美之处在于设置起来简单。 基本上,只需要把一个裸版本库放在 HTTP 根目录,设置一个叫做 post-update 的挂钩就可以了 (见 Git 钩子)。 此时,只要能访问 web 服务器上你的版本库,就可以克隆你的版本库。 下面是设置从 HTTP 访问版本库的方法:

$ cd /var/www/htdocs/
$ git clone --bare /path/to/git_project gitproject.git
$ cd gitproject.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update

这样就可以了。 Git 自带的 post-update 挂钩会默认执行合适的命令(git update-server-info),来确保通过 HTTP 的获取和克隆操作正常工作。 这条命令会在你通过 SSH 向版本库推送之后被执行;然后别人就可以通过类似下面的命令来克隆:

$ git clone https://example.com/gitproject.git

这里我们用了 Apache 里设置了常用的路径 /var/www/htdocs,不过你可以使用任何静态 Web 服务器 —— 只需要把裸版本库放到正确的目录下就可以。 Git 的数据是以基本的静态文件形式提供的(详情见 Git 内部原理)。

通常的,会在可以提供读/写的智能 HTTP 服务和简单的只读的哑 HTTP 服务之间选一个。 极少会将二者混合提供服务。

优点

我们将只关注智能 HTTP 协议的优点。

不同的访问方式只需要一个 URL 以及服务器只在需要授权时提示输入授权信息,这两个简便性让终端用户使用 Git 变得非常简单。 相比 SSH 协议,可以使用用户名/密码授权是一个很大的优势,这样用户就不必须在使用 Git 之前先在本地生成 SSH 密钥对再把公钥上传到服务器。 对非资深的使用者,或者系统上缺少 SSH 相关程序的使用者,HTTP 协议的可用性是主要的优势。 与 SSH 协议类似,HTTP 协议也非常快和高效。

你也可以在 HTTPS 协议上提供只读版本库的服务,如此你在传输数据的时候就可以加密数据;或者,你甚至可以让客户端使用指定的 SSL 证书。

另一个好处是 HTTPS 协议被广泛使用,一般的企业防火墙都会允许这些端口的数据通过。

缺点

在一些服务器上,架设 HTTPS 协议的服务端会比 SSH 协议的棘手一些。 除了这一点,用其他协议提供 Git 服务与智能 HTTP 协议相比就几乎没有优势了。

如果你在 HTTP 上使用需授权的推送,管理凭证会比使用 SSH 密钥认证麻烦一些。 然而,你可以选择使用凭证存储工具,比如 macOS 的 Keychain 或者 Windows 的凭证管理器。 参考 凭证存储 如何安全地保存 HTTP 密码。

2.3 SSH 协议

架设 Git 服务器时常用 SSH 协议作为传输协议。 因为大多数环境下服务器已经支持通过 SSH 访问 —— 即使没有也很容易架设。 SSH 协议也是一个验证授权的网络协议;并且,因为其普遍性,架设和使用都很容易。

通过 SSH 协议克隆版本库,你可以指定一个 ssh:// 的 URL:

$ git clone ssh://[user@]server/project.git

或者使用一个简短的 scp 式的写法:

$ git clone [user@]server:project.git

在上面两种情况中,如果你不指定可选的用户名,那么 Git 会使用当前登录的用的名字。

优势

用 SSH 协议的优势有很多。 首先,SSH 架设相对简单 —— SSH 守护进程很常见,多数管理员都有使用经验,并且多数操作系统都包含了它及相关的管理工具。 其次,通过 SSH 访问是安全的 —— 所有传输数据都要经过授权和加密。 最后,与 HTTPS 协议、Git 协议及本地协议一样,SSH 协议很高效,在传输前也会尽量压缩数据。

缺点

SSH 协议的缺点在于它不支持匿名访问 Git 仓库。 如果你使用 SSH,那么即便只是读取数据,使用者也 必须 通过 SSH 访问你的主机, 这使得 SSH 协议不利于开源的项目,毕竟人们可能只想把你的仓库克隆下来查看。 如果你只在公司网络使用,SSH 协议可能是你唯一要用到的协议。 如果你要同时提供匿名只读访问和 SSH 协议,那么你除了为自己推送架设 SSH 服务以外, 还得架设一个可以让其他人访问的服务。

2.4 Git 协议

最后是 Git 协议。 这是包含在 Git 里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于 SSH 服务,但是访问无需任何授权。 要让版本库支持 Git 协议,需要先创建一个 git-daemon-export-ok 文件 —— 它是 Git 协议守护进程为这个版本库提供服务的必要条件 —— 但是除此之外没有任何安全措施。 要么谁都可以克隆这个版本库,要么谁也不能。 这意味着,通常不能通过 Git 协议推送。 由于没有授权机制,一旦你开放推送操作,意味着网络上知道这个项目 URL 的人都可以向项目推送数据。 不用说,极少会有人这么做。

优点

目前,Git 协议是 Git 使用的网络传输协议里最快的。 如果你的项目有很大的访问量,或者你的项目很庞大并且不需要为写进行用户授权,架设 Git 守护进程来提供服务是不错的选择。 它使用与 SSH 相同的数据传输机制,但是省去了加密和授权的开销。

缺点

Git 协议缺点是缺乏授权机制。 把 Git 协议作为访问项目版本库的唯一手段是不可取的。 一般的做法里,会同时提供 SSH 或者 HTTPS 协议的访问服务,只让少数几个开发者有推送(写)权限,其他人通过 git:// 访问只有读权限。 Git 协议也许也是最难架设的。 它要求有自己的守护进程,这就要配置 xinetdsystemd 或者其他的程序,这些工作并不简单。 它还要求防火墙开放 9418 端口,但是企业防火墙一般不会开放这个非标准端口。 而大型的企业防火墙通常会封锁这个端口。

03. 在本地服务器上搭建git

3.1创建git用户

deng@local:~/test$ sudo adduser git

3.2 切换到git用户

deng@local:~/test$ su - git
密码: 
git@local:~$ 

3.3 创建裸仓库

git@local:~$ git init --bare project.git
提示:使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中
提示:配置使用初始分支名,并消除这条警告,请执行:
提示:
提示:	git config --global init.defaultBranch <名称>
提示:
提示:除了 'master' 之外,通常选定的名字有 'main''trunk''development'。
提示:可以通过以下命令重命名刚创建的分支:
提示:
提示:	git branch -m <name>
已初始化空的 Git 仓库于 /home/git/project.git/
git@local:~$ 

3.4 本地仓添加远程仓的链接

git remote add <仓库名称> <用户名>@<ip地址>:<共享仓库的绝对路径>  
# 另外一个用户初始化本地仓库
deng@local:~/test/project$ git init 
提示:使用 'master' 作为初始分支的名称。这个默认分支名称可能会更改。要在新仓库中
提示:配置使用初始分支名,并消除这条警告,请执行:
提示:
提示:	git config --global init.defaultBranch <名称>
提示:
提示:除了 'master' 之外,通常选定的名字有 'main''trunk''development'。
提示:可以通过以下命令重命名刚创建的分支:
提示:
提示:	git branch -m <name>
已初始化空的 Git 仓库于 /home/deng/test/project/.git/


deng@local:~/test/project$ git add * 
deng@local:~/test/project$ git commit -m "初始化项目"


deng@local:~/test/project$ git remote add origin [email protected]:/home/git/project.git
deng@local:~/test/project$ 

3.5 将本地仓库推送到远程服务器仓库

# git push <远程仓库名> <要推送的分支>  
deng@local:~/test/project$ git push origin master 

The authenticity of host '10.36.100.57 (10.36.100.57)' can't be established.
ED25519 key fingerprint is SHA256:/nUDhkdz+kuI350kWGwCt0rv4HvTjjlKDtgLO2WjvvI.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:1: [hashed name]
    ~/.ssh/known_hosts:14: [hashed name]
    ~/.ssh/known_hosts:17: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.36.100.57' (ED25519) to the list of known hosts.
枚举对象中: 241, 完成.
对象计数中: 100% (241/241), 完成.
使用 4 个线程进行压缩
压缩对象中: 100% (235/235), 完成.
写入对象中: 100% (241/241), 384.45 KiB | 4.75 MiB/s, 完成.
总共 241(差异 53),复用 0(差异 0),包复用 0
remote: 处理 delta 中: 100% (53/53), 完成.
To 10.36.100.57:/home/git/project.git
 * [new branch]      master -> master
deng@local:~/test/project$ 

04. 本地服务器上git其它命令

4.1 删除远程仓库

deng@local:~/test/project$ git remote rm origin
deng@local:~/test/project$ 

4.2 查看远程仓库信息

deng@local:~/test/project$ git remote add origin [email protected]:/home/git/project.git
deng@local:~/test/project$ git remote -v
origin	[email protected]:/home/git/project.git (fetch)
origin	[email protected]:/home/git/project.git (push)
deng@local:~/test/project$ 

4.3 后续推送使用git push

deng@local:~/test/project$ vim test.c  
deng@local:~/test/project$ git add test.c 
deng@local:~/test/project$ git commit -m "修改test.c"
[master 1530bd4] 修改test.c
 1 file changed, 3 insertions(+)

deng@local:~/test/project$ git push origin master 
枚举对象中: 5, 完成.
对象计数中: 100% (5/5), 完成.
使用 4 个线程进行压缩
压缩对象中: 100% (3/3), 完成.
写入对象中: 100% (3/3), 295 字节 | 295.00 KiB/s, 完成.
总共 3(差异 2),复用 0(差异 0),包复用 0
To 10.36.100.57:/home/git/project.git
   5fb6dbf..1530bd4  master -> master
deng@local:~/test/project$ 

4.4 从远程仓库获取项目

git clone <用户名>@<ip地址>:<共享仓库的绝对路径>  

案例

deng@local:~/test/tm$ git clone [email protected]:/home/git/project.git
正克隆到 'project'...
remote: 枚举对象中: 244, 完成.
remote: 对象计数中: 100% (244/244), 完成.
remote: 压缩对象中: 100% (185/185), 完成.
remote: 总共 244(差异 55),复用 239(差异 53),包复用 0
接收对象中: 100% (244/244), 384.67 KiB | 9.86 MiB/s, 完成.
处理 delta 中: 100% (55/55), 完成.
deng@local:~/test/tm$ 

4.5 从远程仓库中更新代码

deng@local:~/test/tm/project$ git pull 
已经是最新的。
deng@local:~/test/tm/project$ 

05. 附录

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dengjin20104042056/article/details/132841275

智能推荐

爬虫.requests.exceptions.ConnectionErro-程序员宅基地

文章浏览阅读219次。requests.exceptions.ConnectionError: HTTPConnectionPool(host='jy-qj.com.cn', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConn..._requests.exceptions.connectionerror: errno1104 getaddrinfo failed

[C++]欧几里得辗转相除求最大公约数,练习_欧几里得算法c++练习题-程序员宅基地

文章浏览阅读1.1k次。编程实现求解最大公约数的欧几里德算法,用户输入两个任意正整数,程序输出他们的最大公约数。算法如下:拆解步骤如下:步骤1: 如果p < q,则交换p和q。步骤2: 令r是p / q 的余数。步骤3: 如果r = 0,则令g = q并终止;否则令p = q, q = r并转向步骤2#include<iostream>#include<stdio.h>//编程实现求解最大公约数的欧几里德算法,用户输入两..._欧几里得算法c++练习题

ViewPager的notifyDataSetChanged()没有效果?来从源码上解决这个问题_viewpager notifydatasetchanged-程序员宅基地

文章浏览阅读841次。前言最近发现自己有很多颇为基础的内容“不会写”了,就比如今天写的内容:ViewPager。最近有小伙伴,在后台私信一些技术细节,大家真的好勤奋~~因为工作的原因,有些私信回复的不是很及时,多多包涵。996伤不起啊!正文平时我们很容易遇到这样的需求:页面底部很多Tab,可以点击或者活动切换不同的页面…估计话还没有说完,有朋友就会脱口而出:ViewPager+ Fragment实现。说起..._viewpager notifydatasetchanged

unity鼠标右键按住不放_在Windows中如何在不按住鼠标键的情况下突出显示和拖放...-程序员宅基地

文章浏览阅读775次。unity鼠标右键按住不放If you use a touchpad or trackpad, or if you have arthritis or other problems when using a mouse, you may find it difficult to hold the primary mouse button down and move the mouse at the..._untiy3d 鼠标右键一直按着

多模态特征融合与多任务学习的特种视频分类_融合多种特征的多任务分类-程序员宅基地

文章浏览阅读3.7k次。前言这篇文章是这个月发布的,采用的方法和参考文献较新,具有一定的参考价值。通过阅读这篇应用型的创新论文,可以很好的对比之前的综述,找到自己的研究创新点。摘要特种视频(本文特指暴力视频)的智能分类技术有助于实现网络信息内容安全的智能监控。针对现有特种视频多模态特征融合时未考虑语义一致性等问题,本文提出了一种基于音视频多模态特征融合与多任务学习的特种视频识别方法。首先,提取特种视频的表观信息和运动信息随时空变化的视觉语义特征及音频信息语义特征;然 后,构 建 具 有 语义保持的共享特征子空间,以实现_融合多种特征的多任务分类

天锐绿盾文档加密软件,文件加密,图纸加密,源代码透明加密系统-程序员宅基地

文章浏览阅读290次,点赞5次,收藏5次。加密后的文件在企业内部环境中可以正常打开和编辑,但一旦脱离受控环境,未经授权则无法打开或显示乱码,从而有效防止了文件非法获取和滥用。总之,天锐绿盾文档加密系统通过源头加密、权限管理、行为审计、文件外发控制等多种手段,为各类型文件提供可靠的安全防护,确保企业数据资产在复杂的网络环境下得到充分的安全保障。对于设计行业的CAD图纸等高价值敏感数据,天锐绿盾能够无缝集成到绘图软件中,确保无论是本地保存还是网络传输,图纸始终处于加密状态,仅授权用户可以正常查看和修改。天锐绿盾 | 办公透明加密、数据防泄漏。

随便推点

sklearn计算余弦相似度_from sklearn.metrics.pairwise import cosine_simila-程序员宅基地

文章浏览阅读5.4k次,点赞4次,收藏16次。余弦相似度在计算文本相似度等问题中有着广泛的应用,scikit-learn中提供了方便的调用方法第一种,使用cosine_similarity,传入一个变量a时,返回数组的第i行第j列表示a[i]与a[j]的余弦相似度例:from sklearn.metrics.pairwise import cosine_similaritya=[[1,3,2],[2,2,1]]cosine_s..._from sklearn.metrics.pairwise import cosine_similarity

NV21 to NV12(YUV420SP)_nv21tonv12-程序员宅基地

文章浏览阅读1.5w次。setPreviewFormat(ImageFormat.NV21)NV21 颜色空间排列 :YYYYYYYY VUVU在用MediaCodec编码的时候,如果设置颜色空间为YUV420SP,那么则需要转换一下,YUV420SP颜色排列顺序为:YYYYYYY UVUV多说一下,YUV420 是于NV12对应的,但是5.0一下的安卓手机支持这个预览颜色的不多则需要将VU顺序进行转_nv21tonv12

Java并发编程: TransmittableThreadLocal实现父子线程之间值传递_transmittablethreadlocal父子线程数据传递-程序员宅基地

文章浏览阅读1k次,点赞23次,收藏18次。TransmittableThreadLocal 是 Alibaba 开源框架 transmittable-thread-local 中的一个核心类,它扩展了 Java 的标准 ThreadLocal 类。与标准的 ThreadLocal 不同,TransmittableThreadLocal 的值可以在线程之间传递,尤其是在线程池中的线程复用场景下。_transmittablethreadlocal父子线程数据传递

用MATLAB仿真DSB调制_dsb信号表达式-程序员宅基地

文章浏览阅读9.4k次,点赞5次,收藏37次。双边带调制的时域表达式:DSB(t)=m(t)cos(w*t);其中,m(t)为调制信号,w为载波频率;MATLAB仿真代码:%DSB 双边带调制clearUc=1;Uw=10;Wc=150;Ww=1;t=0:0.001:2*pi;uw=Uw.*sin(Ww*t);%调制信号uc=Uc.*cos(Wc.*t);%载波信号uDSB=uw.*uc;%DSB已调信号subplot..._dsb信号表达式

阅读nifi源码,加密nifi连接数据库密码_nifi 密码-程序员宅基地

文章浏览阅读303次。前言:前面已经写了nifi数据库解密,我们也可以使用nifi这种加密方法去进行加密,方便以后使用.nifi数据库连接密码解密加密:package com.company;import org.apache.commons.codec.binary.Hex;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.*;import javax.crypto.spec.PBEKeySpec;_nifi 密码

Yii2框架安装及使用指南_yii2框架安装图文-程序员宅基地

文章浏览阅读484次。您可以从Yii2官方网站(https://www.yiiframework.com/)下载最新版本的Yii2框架。将下载的压缩包解压到您的Web服务器目录中,例如/var/www/html/yii2。以上就是关于Yii2框架的安装和基本使用的指南。通过按照上述步骤,您可以成功地安装Yii2框架并创建一个简单的应用程序。Yii2是一款功能强大且高效的PHP框架,它提供了丰富的功能和灵活的架构,使得开发Web应用变得更加简单和高效。本文将详细介绍Yii2框架的安装过程,并提供一些示例代码来帮助您入门。_yii2框架安装图文

推荐文章

热门文章

相关标签