20200619 前一段时间学习 git 时,尝试过搭建公司自用的 git 服务器,并且安装了 gitlab 社区版
后来,因为大家都不太熟悉,而且英文也不好,只好直接采用了 码云 gitee 企业版作为入门
然后,以上搭建过程也都忘记得差不多了!
*疫情期间闲下来,再次重走一遍,并记录下来,以备日后 gitee 过期时再次遗忘
1、 安装git
$ sudo apt install git
重新找了一个 visualBox 虚拟机, ubuntu 20.04,不记得安装过 git ,但是却发现 git 已经存在!
2、创建一个git用户,用来运行git服务
sudo adduser git
如果尝试过多次,可能会已经存在 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 git@192.168.1.203:/gitrepo/sample.git
报错了!
Cloning into 'sample'...
git@192.168.1.203'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 git@192.168.1.203:/home/gitrepo/sample.git/
Cloning into 'sample'...
git@192.168.1.203'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 组
-
创建git用户组 $ sudo addgroup gitgroup Adding group `gitgroup' (GID 1004) ... Done.
-
新建几个账户 sudo adduser gituser1 sudo adduser gituser2
-
将用户添加到 gitgroup 用户组 sudo usermod -G gitgroup git sudo usermod -G gitgroup gituser1 sudo usermod -G gitgroup gituser2
-
确认一下用户组 $ cat /etc/group |grep git
...... gitgroup:x:1004:gituser1,gituser2,git
8、 修改git仓库的用户组
sudo chgrp -R gitgroup /home/gitrepo/sample.git/
9、 客户端分别测试一下
$ git clone gituser1@192.168.1.203:/home/gitrepo/sample.git/
$ git clone gituser2@192.168.1.203:/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:x:1001:1001:,,,:/home/git:/bin/bash 改为: git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
11、 后续
-
客户端测试提交一点儿内容
cd /Users/dhbm/Desktop/git-test/sample
-
查看一下远程仓库
$ git remote -v
origin gituser1@192.168.1.203:/home/gitrepo/sample.git/ (fetch)
origin gituser1@192.168.1.203:/home/gitrepo/sample.git/ (push)
-
vim test.md
随意输入一些东西!
-
$ git add *
-
$ git commit -m '20200619,just test'
[master (root-commit) e4b701f] 20200619,just test 1 file changed, 7 insertions(+) create mode 100644 test.md
-
$ git push
怎么报错了!
gituser1@192.168.1.203's password: Could not chdir to home directory /home/gituser1: No such file or directory fatal: protocol error: bad line length character: This
-
查看一下用户
$ cat /etc/passwd |grep git
git:x:1001:1001:,,,:/home/git:/sbin/nologin
gituser1:x:1002:1002::/home/gituser1:/sbin/nologin
gituser2:x:1003:1003:,,,:/home/gituser2:/bin/bash
-
上服务端查看一下仓库目录 $ 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/
-
换成 git 试试
$ git clone git@192.168.1.203:/home/gitrepo/sample.git/
见鬼了!这次连 clone 也错了?
Cloning into 'sample'...
git@192.168.1.203's password:
fatal: protocol error: bad line length character: This
怎么回事?难道是我们善后工作没有做好,不应该这样子禁止 git 用户登录?
-
改用 gituser2 试试
好在刚才只是学习,禁止登陆并没有操作到 gituser2
$ git clone gituser2@192.168.1.203:/home/gitrepo/sample.git/
这个是正确的!
Cloning into 'sample'... gituser2@192.168.1.203's password: warning: You appear to have cloned an empty repository.
哈哈哈哈哈!😄😄😄😄😄
-
修改禁止 git 用户登录的方法
sudo vim /etc/passwd
如下,看到 git、gituser 和没有修改的 gituser2 的差别!
- /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 同样处理
最终结果如下:
-
再次试试 $ git clone gituser1@192.168.1.203:/home/gitrepo/sample.git/
Cloning into 'sample'... gituser1@192.168.1.203'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 了 !
-
后来还遇到以下错误
错误一:
$ git push
gituser2@192.168.1.203'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 'gituser2@192.168.1.203:/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 'gituser2@192.168.1.203:/home/gitrepo/sample.git/'
主要是权限设置问题 最后,实在没有办法,服务端重新初始化仓库目录 其实差不多就是从头再来一次
来源:oschina
链接:https://my.oschina.net/u/1440971/blog/4316701