【Git服务器】我在服务器上安装了Git并搭建了Git服务器【GitWeb】

Git真的很难吧。

你好@ykhirao!!我是一个自由职业的工程师,已经进入自由职业工作已经两周了。我第一次接手的项目不是开发工作,而是引入了Git/GitHub。现在我正计划从WinSCP/TeraTerm开始构建基于Git的部署环境,并重新研究Git相关内容。

我将写下这些见解。

我打算基本上以这里 https://git-scm.com/book/ja/v2/Gitサーバー-プロトコル 的第四章内容为中心进行写作。

尝试运行 GitWeb,这是符合 Git 标准的一个选项。

スクリーンショット 2020-07-10 23.46.16.png

不是使用GitHub等工具,而是在GCP的VPS上放置一个裸仓库试试看。

这就是类似于Qiita的感觉。如果有时间,请自己去查一下Git服务器是什么意思。我并不太清楚。大概指的是只托管Git的裸仓库(即.git/目录)的服务器…

最初我不知道他们在说什么是Git服务器。

Git服务器是什么?这是我一无所知的状态。

Git on the Server

因为写着这样的话,关于在服务器上安装Git的讨论,我觉得可能是翻译错误。

 

在中文中, 这句话可以这样表达:如此

Many Git servers ... 

看到这样写着,感觉不是翻译错误,而是普遍使用的词语,于是对词汇选择暂时满意了。

yk@yk ~ % git --version
git version 2.25.0

如果用河流来比喻Git,理解起来会更容易(欢迎提出异议)。

以下の中国語のネイティブ表現を1つ作ります:
主要的Git协议有:

    1. 本地协议

 

    1. HTTP/S协议

 

    SSH协议

好像有一个。我从来没有用过这个Local协议,所以感觉非常新鲜。

找一个适当的存储库下载。

暫時從 https://github.com/explore 上找到一個適合自己、看起來輕便的儲存庫。

由于出现了https://github.com/denoland,选择看一下似乎有最少提交数量的https://github.com/denoland/ninja_gn_binaries。

# GitHubから適当なレポジトリをクローンしてくる
$ git clone https://github.com/denoland/ninja_gn_binaries

Cloning into 'ninja_gn_binaries'...
(ry)


# プロジェクト名.git というフォルダ名をつけて bareレポジトリというのを作成する
$ git clone --bare ninja_gn_binaries ninja_gn_binaries.git

# bareレポジトリに移動
$ cd ninja_gn_binaries.git

# git操作に反応するhooksをサンプルを使用できる形に
$ mv hooks/post-update.sample hooks/post-update

# 全ユーザーに実行権限付与
$ chmod a+x hooks/post-update

我已经准备好了本地协议的设置,感觉不错。
这次我将它放在了普通位置的 /Users/yk/workspace/ninja_gn_binaries.git ,但如果放在同一网络内的共享文件系统中,可以从网络内进行pull/push等访问。

$ pwd
/Users/yk/workspace/ninja_gn_binaries

# remoteの設定をしよう
$ git remote add local /Users/yk/workspace/ninja_gn_binaries.git

# この場合
# git push local master
# みたいにアクセスできるようになる

打开.git目录下的config文件。

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "origin"]
        url = https://github.com/denoland/ninja_gn_binaries
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[remote "local"]
        url = /Users/yk/workspace/ninja_gn_binaries.git
        fetch = +refs/heads/*:refs/remotes/local/*

你设定得很好。原始位置设置为https://github.com/denoland/ninja_gn_binaries,所以我认为对于 git push origin master,因为这是他人的存储库,所以在权限上会出错。如果是 git push local master,那么应该可以很好地将文件推送到自己的计算机内。

$ pwd
/Users/yk/workspace/ninja_gn_binaries

$ touch README.md
$ git add .
$ git commit -m "Create readme"
[master db503c6] Create readme
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md

$ git log
commit db503c617db3b9f8ce88c8c1f6afc9a71d4675f8 (HEAD -> master, local/master)
Author: Yuki <yuki@example.com>
Date:   Thu Jul 9 00:31:45 2020 +0900

    Create readme

commit 50abf78bdabe66518865e3b9fdfaaade87bcfded (tag: 20200506, origin/master, origin/HEAD)
Author: Bert Belder <bertbelder@gmail.com>
Date:   Wed May 6 01:41:43 2020 +0200

    Update gn to git revision 5ed3c9cc

我们成功地将代码推送到了 local/master 分支!现在让我们把这个远程分支克隆到另一个文件中吧!

$ pwd
/Users/yk/workspace

$ git clone /Users/yk/workspace/ninja_gn_binaries.git second-clone-sample
Cloning into 'second-clone-sample'...
done.

$ ll | grep second-clone-sample
drwxr-xr-x   7 yk  staff   224  7  9 00:37 second-clone-sample

$ cd second-clone-sample

$ git log
commit db503c617db3b9f8ce88c8c1f6afc9a71d4675f8 (HEAD -> master, origin/master, origin/HEAD)
Author: Yuki <yuki@example.com>
Date:   Thu Jul 9 00:31:45 2020 +0900

    Create readme

commit 50abf78bdabe66518865e3b9fdfaaade87bcfded (tag: 20200506)
Author: Bert Belder <bertbelder@gmail.com>
Date:   Wed May 6 01:41:43 2020 +0200

    Update gn to git revision 5ed3c9cc

我已经成功将它克隆到另一个文件夹中。

    本地协议

话已经结束了

    1. HTTP/S 协议

 

    SSH 协议

很简单

# HTTP/S プロトコル
git clone https://github.com/denoland/ninja_gn_binaries.git
# 仮にプライベートレポジトリの場合、この段階でID/Passwordが聞かれる


# SSH プロトコル
git@github.com:denoland/ninja_gn_binaries.git
# 公開鍵を登録していると使えて
# プライベートレポジトリでもID/Passの入力なしで使える

这就是我经常看的那个!GitHub上的这个地方。

スクリーンショット 2020-07-09 0.40.17.png

光秃秃的存储库的本质就是仅管理通过 git init 创建的 .git 文件夹的存储库。[https://git-scm.com/book/ja/v2/Gitサーバー-サーバー用の-Git-の取得]

$ mkdir sample

$ cd sample

$ ls

$ ll
total 0
drwxr-xr-x   2 yk  staff   64  7  9 00:49 .
drwxr-xr-x  10 yk  staff  320  7  9 00:49 ..

$ git init
Initialized empty Git repository in /Users/yk/workspace/sample/.git/

$ ll
total 0
drwxr-xr-x   3 yk  staff   96  7  9 00:49 .
drwxr-xr-x  10 yk  staff  320  7  9 00:49 ..
drwxr-xr-x   9 yk  staff  288  7  9 00:49 .git

我认为,在创建了名为 bare 的文件但没有实体的情况下,被称为 Git 服务器的东西,是当今世界上想要构建 Git 服务器并进行 Git 管理的人们的选择大约有三种。

    1. 使用GitHub/GitLab/其他托管服务

 

    1. 将裸仓库放置在同一服务器的不同层级

 

    将裸仓库放置在另一台服务器上

除非有特别的理由,比如”公司内部有安全问题”,否则我认为最好的方案是说服上司使用GitHub作为裸库替代方案,理由是微软已经收购了这个设计图网站。它能够使用问题追踪工具、看板和拉取请求等,非常方便。

终于开始在服务器上安装Git进行服务器搭建的部分。

我在这里查看了GCP的免费VPS并启动了它。

当你注册了公钥后,就可以通过SSH进行以下操作。

yk@yk sample % ssh 3X.1XX.XX.45

(yes)

Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-1019-gcp x86_64)

(ryaku)

yk@lwaysfree-micro:~$

由于GCP-Ubuntu20.04中没有安装git,所以随便安装一个。

$ git
-bash: git: command not found
$ sudo apt update
$ sudo apt upgrade
$ git --version
git version 2.25.1

创建一个项目的裸仓库(bare repository)。

$ sudo mkdir /opt/git
$ sudo mkdir /opt/git/project.git
$ cd /opt/git/project.git
$ sudo git init --bare
Initialized empty Git repository in /opt/git/project.git/

在本地电脑上各种操作

$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
$ touch README.md
$ git add .
$ git commit -m "INIT"
[master (root-commit) 909289c] INIT
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md
$

# リモートの設定する
# ykとIPアドレスの部分は適宜変えて
$ git remote add origin yk@34.105.XX.XX:/opt/git/project.git
$ git push origin master
% git push origin master

Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 213 bytes | 213.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
error: remote unpack failed: unable to create temporary object directory
To 34.105.93.45:/opt/git/project.git
 ! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'yk@34.105.93.45:/opt/git/project.git'

由于出现了写入错误,所以暂时将所有权交给用户所有者。

yk@lwaysfree-micro:/opt/git$ sudo chown yk project.git/ -R
yk@lwaysfree-micro:/opt/git$ ll
total 12
drwxr-xr-x 3 root root 4096 Jul  8 16:11 ./
drwxr-xr-x 3 root root 4096 Jul  8 16:10 ../
drwxr-xr-x 7 yk   root 4096 Jul  8 16:34 project.git/

好的,没问题。推送成功!

% git push origin master

Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 213 bytes | 213.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To 34.105.93.45:/opt/git/project.git
 * [new branch]      master -> master

你还可以将其克隆到本地!听起来不错吧。
这是传说中的专门为Git而设的Git服务器吗?

$ git clone yk@34.105.XX.XX:/opt/git/project.git sample-clone
Cloning into 'sample-clone'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

$ cd sample-clone

y$ git log
commit 909289c7a8057ec6fcb207da70684e9daa81e39e (HEAD -> master, origin/master, origin/HEAD)
Author: Yuki <yuki@example.com>
Date:   Thu Jul 9 01:22:46 2020 +0900

4.10 Git服务器 – 如前所述

如果你自己搭建服务器,你将能够控制许多方面,并且可以在防火墙内运行服务器。然而,搭建和运营服务器需要相当的努力。如果使用托管服务,准备和维护服务器会变得简单。然而,你必须将自己的代码放在其他人的服务器上。有些组织可能不允许这样做。

如果可能的话,我们可以使用GitHub之类的平台~

尝试启动GitWeb

4.7 Git服务器 – GitWeb

使用Mac的话,可以轻松地通过Web浏览器搭建一个能够展示Git的服务器(因为Ruby已经内装在Mac上了)。

yk@yk workspace % mkdir sample
yk@yk workspace % cd sample 
yk@yk sample % git init 
Initialized empty Git repository in /Users/yk/workspace/sample/.git/
yk@yk sample % touch README.md
yk@yk sample % git add README.md 
yk@yk sample % git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   README.md

yk@yk sample % git commit -m "INIT"
[master (root-commit) 290565d] INIT
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md
yk@yk sample % git instaweb --httpd=webrick --stop
yk@yk sample % git instaweb --httpd=webrick       
yk@yk sample % 

# http://127.0.0.1:1234/ が立ち上がります!!!!!

# 必要なくなったら落とす
yk@yk sample % git instaweb --httpd=webrick --stop
スクリーンショット 2020-07-10 23.46.16.png

不需要Source Tree之类的了!!!!!(极端说法)

我只是在这里偷偷地想,我更喜欢直来直去的人,例如TIG。

在使用GitWeb方面,不如使用GitLab吧,因为它是开源的,这种氛围在GitLab上得到了展现。

Git服务器是什么?

我对这个问题进行了调查,但仍然不太清楚。

我曾认为只为Git而准备的跳板服务器被称为Git服务器。
若只需托管裸仓库,并非必须另外建立服务器,可以将其放置在项目所在服务器的不同层级,我认为这样更为方便。(评论)

请用中文进行全文改写。

bannerAds