【Git服务器】我在服务器上安装了Git并搭建了Git服务器【GitWeb】
Git真的很难吧。
你好@ykhirao!!我是一个自由职业的工程师,已经进入自由职业工作已经两周了。我第一次接手的项目不是开发工作,而是引入了Git/GitHub。现在我正计划从WinSCP/TeraTerm开始构建基于Git的部署环境,并重新研究Git相关内容。
我将写下这些见解。
我打算基本上以这里 https://git-scm.com/book/ja/v2/Gitサーバー-プロトコル 的第四章内容为中心进行写作。
尝试运行 GitWeb,这是符合 Git 标准的一个选项。

不是使用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协议有:
-
- 本地协议
-
- 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
我已经成功将它克隆到另一个文件夹中。
- 本地协议
话已经结束了
-
- 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上的这个地方。

光秃秃的存储库的本质就是仅管理通过 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 管理的人们的选择大约有三种。
-
- 使用GitHub/GitLab/其他托管服务
-
- 将裸仓库放置在同一服务器的不同层级
- 将裸仓库放置在另一台服务器上
除非有特别的理由,比如”公司内部有安全问题”,否则我认为最好的方案是说服上司使用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

不需要Source Tree之类的了!!!!!(极端说法)
我只是在这里偷偷地想,我更喜欢直来直去的人,例如TIG。
在使用GitWeb方面,不如使用GitLab吧,因为它是开源的,这种氛围在GitLab上得到了展现。
Git服务器是什么?
我对这个问题进行了调查,但仍然不太清楚。
我曾认为只为Git而准备的跳板服务器被称为Git服务器。
若只需托管裸仓库,并非必须另外建立服务器,可以将其放置在项目所在服务器的不同层级,我认为这样更为方便。(评论)
请用中文进行全文改写。