Author:onceday date:2023年3月5日
满满长路有人对你微笑过嘛…
windows安装可参考文章:git简易配置_onceday_CSDN博客
參考文档:
远程仓库可以是一个裸仓库(base repository),即一个没有当前工作目录的仓库,只包含.git
文件夹里面的内容。
可以通过四种协议来传输资料:
本地协议Local
,远程库是同一主机上的另外一个目录,通常通过共享文件系统实现。如果将所有代码都存放于同一台电脑,不是一个好主意。可以使用/srv/git/my.git
和file:///srv/git/mygit
,如果没有指定file://
,Git会尝试使用硬链接(hard link)或直接赋值所需的文件,如果指定file://
,Git会触发平时用于网路传输资料的进程,效率可能会低一些。
如下是一个示例:
git clone /home/ubuntu/c-code/.git
git add local /home/ubuntu/c-code/.git
HTTP协议,有智能协议(可以根据需要提供匿名服务或者加密授权服务)和哑协议两种(web服务器提供静态服务)。
SSH(secure Shell)协议,常见的安全和加密传输协议。
Git协议,这是包含在Git里的一个特殊守护进程,不能提供授权和加密服务,传输速率快。
一般来说HTTP协议和Git协议可用于大型开源代码的分享服务器,如果是可控开发,还是需要用到HTTPS协议和SSH协议。
Git仓库需要创建裸仓库,通常需要从现有仓库中导出,裸仓库不能包含当前工作目录。
ubuntu->git-test:$ git clone --bare cc cc.git
Cloning into bare repository 'cc.git'...
done.
ubuntu->git-test:$ ll cc.git/
total 44
drwxrwxr-x 7 ubuntu ubuntu 4096 Mar 5 13:07 ./
drwxrwxr-x 4 ubuntu ubuntu 4096 Mar 5 13:07 ../
drwxrwxr-x 2 ubuntu ubuntu 4096 Mar 5 13:07 branches/
-rw-rw-r-- 1 ubuntu ubuntu 116 Mar 5 13:07 config
-rw-rw-r-- 1 ubuntu ubuntu 73 Mar 5 13:07 description
......
ubuntu->git-test:$ ll cc
total 112
drwxrwxr-x 3 ubuntu ubuntu 4096 Mar 5 12:51 ./
drwxrwxr-x 4 ubuntu ubuntu 4096 Mar 5 13:07 ../
-rw-rw-r-- 1 ubuntu ubuntu 8124 Mar 5 12:48 .clang-format
drwxrwxr-x 8 ubuntu ubuntu 4096 Mar 5 12:48 .git/
-rw-rw-r-- 1 ubuntu ubuntu 6 Mar 5 12:48 .gitignore
-rw-rw-r-- 1 ubuntu ubuntu 63 Mar 5 12:48 makefile
-rw-rw-r-- 1 ubuntu ubuntu 408 Mar 5 12:48 socket.c
......
如上所示,使用git clone --bare project project.git
即可,project是当前git仓库的目录路径,project.git是新的裸仓库的目录路径。注意project.git
是目录不是文件,后缀.git
是惯例使用,而非必须。
上述命令的效果和cp -Rf project/.git project.git
是基本等价的,但配置文件有些许不同。
可以看到,裸仓库中只有.git
中的文件,而没有当前工作目录的内容。
创建好仓库后,可以通过SSH协议把文件复制到服务器上(需要先将SSH公钥放在服务器上):
scp -r cc.git [email protected]:/home/ubuntu/git-test/
然后便可以使用ssh来读取此服务器上/home/ubuntu/git-test/
目录来克隆对应仓库。
git clone [email protected]:/home/ubuntu/git-test/cc.git
如果SSH连接用户对该目录拥有可写入权限,那么他就拥有推送权限。
使用SSH连接直接初始化git裸仓库的命令如下:
git init --bare --shared
对于小型项目,上面的SSH+裸仓库已够用,只需通过对不同成员的账号进行管理即可。
对于用于ssh连接的账户,其shell可以设置为git-shell
,可以方便地将用户git的活动限制在与Git相关的范围内。更换ssh连接使用下述命令即可:
$ cat /etc/shells # see if git-shell is already in there. If not...
$ which git-shell # make sure git-shell is installed on your system.
$ sudo -e /etc/shells # and add the path to git-shell from last command
$ sudo chsh git -s $(which git-shell) # 修改指定系统用户的shell
设置为git-shell
的用户,其只能利用SSH连接对Git仓库进行推送和拉取操作,而不能登录机器并取得普通shell。任何试图登入,都会被拒绝。
这是创建一个Git协议的服务器,具体过程请参考progit2
书籍。
开启该服务器很简单,如下:
$ git daemon --reuseaddr --base-path=/srv/git/ /srv/git/
--reuseaddr
,选项允许服务器在无需等待旧连接超时的情况下重启。--base-path
,选项允许用户在未完全 指定路径的条件下克隆项目, 结尾的路径将告诉 Git 守护进程从何处寻找仓库来导出。目前的Linux系统通常使用systemd
提供系统服务管理能力,如下配置:
[Unit]
Description=Start Git Daemon
[Service]
ExecStart=/usr/bin/git daemon --reuseaddr --base-path=/srv/git/ /srv/git/
Restart=always
RestartSec=500ms
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=git-daemon
User=git
Group=git
[Install]
WantedBy=multi-user.target
将该文件的内容放在/etc/systemd/system/git-daemon.service
中即可,操作主要使用接来下几个命令:
systemctl enable git-daemon
,使能该服务,在系统启动时能自动运行。systemctl start git-daemon
,启动该服务。systemctl stop git-daemon
,停止该服务。systemctl restart git-daemon
,重启该服务。systemctl disable git-daemon
,关闭该服务,后续不会随系统自启动。通过在目标仓库下创建git-daemon-export-ok
文件可以允许Git提供无需授权的项目访问服务。
关于这个协议,详情请参考progit2
书籍。
这个一般是借助web服务器来实现,这里推荐一下现代化的工具,即GitLab
,该工具是开源的,可以用来搭建私有的git 服务器,详情可以参考官方网站:GitLab.org / GitLab FOSS · GitLab。
web服务器来实现,这里推荐一下现代化的工具,即GitLab
,该工具是开源的,可以用来搭建私有的git 服务器,详情可以参考官方网站:GitLab.org / GitLab FOSS · GitLab。