linux 下搭建自己的 git 服务器以及配置多用户

20200619 前一段时间学习 git 时,尝试过搭建公司自用的 git 服务器,并且安装了 gitlab 社区版

后来,因为大家都不太熟悉,而且英文也不好,只好直接采用了 码云 gitee 企业版作为入门

然后,以上搭建过程也都忘记得差不多了!

疫情期间闲下来,再次重走一遍,并记录下来,以备日后 gitee 过期时再次遗忘

1、 安装git

$ sudo apt install git

重新找了一个 visualBox 虚拟机, ubuntu 20.04,不记得安装过 git ,但是却发现 git 已经存在!

2、创建一个git用户,用来运行git服务

sudo adduser git
Passed = 123

如果尝试过多次,可能会已经存在 git 用户,可以先完全删除 git 用户及其目录

$ sudo userdel -r git
userdel: git mail spool (/var/mail/git) not found
这个错误好像没有发现什么影响!

3、创建一个 git 仓库目录

cd /home
$ sudo mkdir gitrepo
$ cd gitrepo

前几次操作时,直接用有 root 权限的用户名登录,并且直接在该用户的 home 下建立的仓库目录(没有 cd /home),后续 clone 时却没有加上该用户的 home 路径,造成过多次错误!

4、初始化 Git 仓库

$ sudo git init --bare --shared sample.git

返回结果:
Initialized empty shared Git repository in /home/gitrepo/sample.git/

注意返回提示的仓库路径: /home/gitrepo/sample.git/
在客户端 clone 时一定要写正确了!
如果如上一步所提到的:没有 cd /home , 这里的路径会带上实际登录的用户名
例如:/home/dhbm/srv/sample.git/

5、 修改仓库目录 owner 为 git

sudo chown -R git:git /home/gitrepo

确认一下

$ ll
...
drwxrwsr-x 7 git  git  4096 Jun 19 09:58 sample.git/

6、 客户端测试一下

$ git clone [email protected]:/gitrepo/sample.git

报错了!

Cloning into 'sample'...
[email protected]'s password: 
fatal: '/gitrepo/sample.git' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

仓库路径没有书写正确!请对照前面 init 时返回的路径信息
再来!

$ git clone [email protected]:/home/gitrepo/sample.git/
Cloning into ‘sample’…
[email protected]’s password:
warning: You appear to have cloned an empty repository.

确认一下:

	$ ls -al
	total 0
	drwxr-xr-x   3 dhbm  staff   96  6 19 13:43 .
	drwx------+ 24 dhbm  staff  768  6 19 14:10 ..
	drwxr-xr-x   3 dhbm  staff   96  6 19 13:43 sample

这就 ok 了!

如果只是个人使用,到这里就算完成了!
如果公司多人使用,建议给每个人单独分配一个账号,否则,仓库无法管理了

7、 再创建几个用户,并统一到 gitgroup 组

  1. 创建git用户组
    $ sudo addgroup gitgroup
    Adding group `gitgroup’ (GID 1004) …
    Done.

  2. 新建几个账户
    sudo adduser gituser1
    sudo adduser gituser2

  3. 将用户添加到 gitgroup 用户组
    sudo usermod -G gitgroup git
    sudo usermod -G gitgroup gituser1
    sudo usermod -G gitgroup gituser2

  4. 确认一下用户组
    $ cat /etc/group |grep git

    ......
    gitgroup:x:1004:gituser1,gituser2,git
    

8、 修改git仓库的用户组

sudo chgrp -R gitgroup /home/gitrepo/sample.git/

或者

sudo chown -R :gitgroup /home/gitrepo/sample.git/

9、 客户端分别测试一下

$ git clone [email protected]:/home/gitrepo/sample.git/
$ git clone [email protected]:/home/gitrepo/sample.git/

自行确认一下即可!

10、善后

刚才建立了几个用户,只作为 git 使用,所以,必须禁止他们实际登录到服务器
学习 git 的时候,注意力不在这里,所以,放在最后单独处理!

$ sudo usermod -s /sbin/nologin gituser1

就地测试一下

	$ su gituser1
	Password: 
	This account is currently not available.

$ sudo usermod -s /sbin/nologin git

$ sudo usermod -s /sbin/nologin gituser2

** 后续测试结果证实:不能按照这个办法禁止登录!
摘录如下:
sudo vim /etc/passwd
找到
git❌1001:1001:,:/home/git:/bin/bash
改为:
git❌1001:1001:,:/home/git:/usr/bin/git-shell

11、 后续

  1. 客户端测试提交一点儿内容

    cd /Users/dhbm/Desktop/git-test/sample

  2. 查看一下远程仓库
    $ git remote -v
    origin [email protected]:/home/gitrepo/sample.git/ (fetch)
    origin [email protected]:/home/gitrepo/sample.git/ (push)

  3. vim test.md
    随意输入一些东西!

  4. $ git add *

  5. $ git commit -m ‘20200619,just test’

     [master (root-commit) e4b701f] 20200619,just test
      1 file changed, 7 insertions(+)
      create mode 100644 test.md
    
  6. $ git push
    怎么报错了!

     [email protected]'s password: 
     Could not chdir to home directory /home/gituser1: No such file or directory
     fatal: protocol error: bad line length character: This
    
  7. 查看一下用户
    $ cat /etc/passwd |grep git

    git❌1001:1001:,:/home/git:/sbin/nologin
    gituser1❌1002:1002::/home/gituser1:/sbin/nologin
    gituser2❌1003:1003:,:/home/gituser2:/bin/bash

  8. 上服务端查看一下仓库目录
    $ ll

     ......
     drwxr-xr-x  3 git      git      4096 Jun 19 10:00 git/
     drwxr-xr-x  3 git      git      4096 Jun 19 09:58 gitrepo/
     drwxr-xr-x  2 gituser2 gituser2 4096 Jun 19 13:34 gituser2/
    

    怎么 gitrepo 还是属于 git:git ,前面修改组没有成功?

    sudo chown -R :gitgroup /home/gitrepo/sample.git/

  9. 换成 git 试试

$ git clone [email protected]:/home/gitrepo/sample.git/
见鬼了!这次连 clone 也错了?

Cloning into 'sample'...
[email protected]'s password: 
fatal: protocol error: bad line length character: This

怎么回事?难道是我们善后工作没有做好,不应该这样子禁止 git 用户登录?

  1. 改用 gituser2 试试
    好在刚才只是学习,禁止登陆并没有操作到 gituser2

    $ git clone [email protected]:/home/gitrepo/sample.git/
    这个是正确的!

    Cloning into 'sample'...
    [email protected]'s password: 
    warning: You appear to have cloned an empty repository.
    

哈哈哈哈哈!😄😄😄😄😄

  1. 修改禁止 git 用户登录的方法
    sudo vim /etc/passwd
    如下,看到 git、gituser 和没有修改的 gituser2 的差别!
    在这里插入图片描述

  2. /bin/bash 修改为 /usr/bin/git-shell

找到	
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
		
gituser1 同样处理

最终结果如下:

在这里插入图片描述

  1. 再次试试
    $ git clone [email protected]:/home/gitrepo/sample.git/

    Cloning into 'sample'...
    [email protected]'s password: 
    Could not chdir to home directory /home/gituser1: No such file or directory
    warning: You appear to have cloned an empty repository.
    

    我靠!什么时候把 gituser1 的 home 目录删除了

    $ sudo mkdir gituser1
    $ sudo chown -R gituser1:gituser1 gituser1

    加上 gituser1 的 home 之后,再来试试?终于 ok 了 !

  2. 后来还遇到以下错误

错误一:

$ git push
[email protected]'s password: 
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 210 bytes | 210.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
error: remote unpack failed: unable to create temporary object directory
To 192.168.1.203:/home/gitrepo/sample.git/
 ! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to '[email protected]:/home/gitrepo/sample.git/'

错误二:

	Total 3 (delta 0), reused 0 (delta 0)
	remote: error: refusing to update checked out branch: refs/heads/master
	remote: error: By default, updating the current branch in a non-bare repository
	remote: is denied, because it will make the index and work tree inconsistent
	remote: with what you pushed, and will require 'git reset --hard' to match
	remote: the work tree to HEAD.
	remote: 
	remote: You can set the 'receive.denyCurrentBranch' configuration variable
	remote: to 'ignore' or 'warn' in the remote repository to allow pushing into
	remote: its current branch; however, this is not recommended unless you
	remote: arranged to update its work tree to match what you pushed in some
	remote: other way.
	remote: 
	remote: To squelch this message and still keep the default behaviour, set
	remote: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
	To 192.168.1.203:/home/gitrepo/sample.git/
	 ! [remote rejected] master -> master (branch is currently checked out)
	error: failed to push some refs to '[email protected]:/home/gitrepo/sample.git/'

主要是权限设置问题
最后,实在没有办法,服务端重新初始化仓库目录
其实差不多就是从头再来一次

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章