git学习(4)-git在服务器上的操作

文章首发于:My Blog 欢迎大佬们前来逛逛

1. 协议

Git使用四种协议来传输数据

  1. 本地传输
  2. SSH协议
  3. Git协议
  4. HTTP协议

1.1 本地协议

其实就是硬盘上的另一个目录,其中团队的每个成员都对一个共享的文件系统具有访问权

如果你使用一个共享的文件系统,就可以在一个本地文件系统中克隆仓库,推送和获取。克隆的时候只需要将远程仓库的路径作为 URL 使用,比如下面这样:

$ git clone F:/code/git/Git-test
Cloning into 'Git-test'...
done.

这样我们就在本地的文件夹创建了一个具有本地协议的远程仓库

也可以使用file:// 的前缀:

$ git clone file://F:/code/git/Git-test
Cloning into 'Git-test'...
remote: Enumerating objects: 35, done.
remote: Counting objects: 100% (35/35), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 35 (delta 9), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (35/35), done.
Resolving deltas: 100% (9/9), done.

两种方式的不同:

  1. 直接使用路径:Git会尝试以硬链接或者直接复制它文件
  2. 如果使用file:// :Git会调用它平时通过网络来传输数据的工序,效率相对较低。

使用 file:// 前缀的主要原因是当你需要一个不包含无关引用或对象的干净仓库副本的时候 — 一般指从其他版本控制系统导入的


把本地的仓库添加作为你的远程仓库:

$ git remote add local_proj F:/code/git/Git-test/Git-test

查看所有的远程仓库

$ git remote
local_proj
origin

现在我们就由 local_projorigin两个远程仓库了

1.2 SSH协议

SSH协议是Git中最常用的协议。

SSH 也是唯一一个同时支持读写操作的网络协议,另外两个协议(HTTP和Git)通常是只读的,执行写操作一定是SSH协议。

SSH 同时也是一个验证授权的网络协议;而因为其普遍性,一般架设和使用都很容易。

SSH协议的使用我们都已经很熟悉了:

$ git clone ssh://git@github.com:luumod/Git-test.git

便可以把我们的GitHub上的仓库克隆到我们的本地。

可以省略ssh://

$ git clone git@github.com:luumod/Git-test.git

通过 SSH 进行访问是安全的 — 所有数据传输都是加密和授权的。

最后,和 Git 及本地协议一样,SSH 也很高效,会在传输之前尽可能压缩数据。

1.3 Git协议

这是一个包含在 Git 软件包中的特殊守护进程。

打算支持 Git 协议的仓库,需要先创建 git-daemon-export-ok 文件 — 它是协议进程提供仓库服务的必要条件 — 但除此之外该服务没有什么安全措施。

要么所有人都能克隆 Git 仓库,要么谁也不能。

Git协议是最快的传输协议,对一个不需要对读操作进行授权的项目来说,架设Git协议是一个不错的选择。

Git 协议消极的一面是缺少授权机制。用 Git 协议作为访问项目的唯一方法通常是不可取的。一般的做法是,同时提供 SSH 接口,让几个开发者拥有推送(写)权限,其他人通过 git:// 拥有只读权限。 Git 协议可能也是最难架设的协议。它要求有单独的守护进程,需要定制 — 我们将在本章的 “Gitosis” 一节详细介绍它的架设 — 需要设定 xinetd 或类似的程序,而这些工作就没那么轻松了。该协议还要求防火墙开放 9418 端口,而企业级防火墙一般不允许对这个非标准端口的访问。大型企业级防火墙通常会封锁这个少见的端口。

1.4 HTTP/S协议

HTTP或者HTTPS协议具有非常高的简洁性

我们把Git的裸仓库文件放在http的根目录下,配置一个特定的 post-update挂钩就可以实现

  1. 配置 post-update挂钩
$ cd .git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update

mv命令是把source文件改名为 dest,即post-update.sample改为post-update

chmod a+x是指all所有人都可以x执行excu 这个post-update

在你向仓库推送的时候,post-update会执行: git update-server-info来确保通过 HTTP 的获取和克隆正常工作。

之后我们便可以通过HTTP来克隆仓库了:

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

通过 HTTP 进行推送操作也是可能的,不过这种做法不太常见,并且牵扯到复杂的 WebDAV 设定。

2. 服务器上部署Git

首先把现有仓库导出为裸仓库,即一个不含当前工作目录的仓库:

使用 --bare ,裸仓库的目录名以 .git结尾

$ git clone --bare Git-test Git-test.git
Cloning into bare repository 'Git-test.git'...
done.

clone其实就是 相当于 git initgit fetch

先由它建立一个空目录,而之后传输数据对象的操作并无任何输出,只是悄悄在幕后执行。

它仅取出 Git 仓库的必要原始数据,存放在该目录中,而不会另外创建工作目录。

有了裸仓库的副本后,剩下的就是把它放到服务器上并设定相关协议。假设一个域名为 git.example.com 的服务器已经架设好,并可以通过 SSH 访问,我们打算把所有 Git 仓库储存在 /opt/git 目录下。只要把裸仓库复制过去:

$ scp -r my_project.git user@git.example.com:/opt/git

现在,所有对该服务器有 SSH 访问权限,并可读取 /opt/git 目录的用户都可以用下面的命令克隆该项目:

$ git clone user@git.example.com:/opt/git/my_project.git

如果某个 SSH 用户对 /opt/git/my_project.git 目录有写权限,那他就有推送权限。如果到该项目目录中运行 git init 命令,并加上 --shared 选项,那么 Git 会自动修改该仓库目录的组权限为可写(译注:实际上 --shared 可以指定其他行为,只是默认为将组权限改为可写并执行 g+sx,所以最后会得到 rws。)。

$ ssh user@git.example.com
$ cd /opt/git/my_project.git
$ git init --bare --shared

由此可见,根据现有的 Git 仓库创建一个裸仓库,然后把它放上你和同事都有 SSH 访问权的服务器是多么容易。现在已经可以开始在同一项目上密切合作了。

值得注意的是,这的的确确是架设一个少数人具有连接权的 Git 服务的全部 — 只要在服务器上加入可以用 SSH 登录的帐号,然后把裸仓库放在大家都有读写权限的地方。一切都准备停当,无需更多。

下面的几节中,你会了解如何扩展到更复杂的设定。这些内容包含如何避免为每一个用户建立一个账户,给仓库添加公共读取权限,架设网页界面,使用 Gitosis 工具等等。然而,只是和几个人在一个不公开的项目上合作的话,仅仅是一个 SSH 服务器和裸仓库就足够了,记住这点就可以了。

3. SSH公钥的创建

查看是否有SSH公钥

$ cd ~/.ssh
$ ls
id_rsa  id_rsa.pub  known_hosts  known_hosts.old

.pub 后缀的文件就是公钥,另一个文件则是密钥。

如果没有,则使用下面的命令来创建 :

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/schacon/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/schacon/.ssh/id_rsa.
Your public key has been saved in /Users/schacon/.ssh/id_rsa.pub.
The key fingerprint is:
43:c5:5b:5f:b1:f1:50:43:ad:20:a6:92:6a:1f:9a:3a schacon@agadorlaptop.local

它先要求你确认保存公钥的位置(.ssh/id_rsa),然后它会让你重复一个密码两次,如果不想在使用公钥的时候输入密码,可以留空。

现在,所有做过这一步的用户都得把它们的公钥给你或者 Git 服务器的管理员(假设 SSH 服务被设定为使用公钥机制)。他们只需要复制 .pub 文件的内容然后发邮件给管理员。

posted @ 2023-03-12 23:08  hugeYlh  阅读(55)  评论(0编辑  收藏  举报