博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5.5. git-daemon 服务器
阅读量:6766 次
发布时间:2019-06-26

本文共 7132 字,大约阅读时间需要 23 分钟。

5.5.1. git-daemon - A really simple server for git repositories

在/home/gitroot/ 上运行 git 守护进程

$ cd /home/gitroot$ mkdir test.git$ cd test.git$ git --bare init --sharedInitialized empty shared Git repository in /home/gitroot/test.git/
git daemon --verbose --export-all --base-path=/home/gitroot --enable=receive-pack --reuseaddr

允许push,否则该仓库只能clone/pull

sudo git daemon --verbose --export-all --base-path=/home/gitroot --enable=upload-pack --enable=upload-archive --enable=receive-pack

或者增加配置项

$ git config daemon.receivepack true$ git config --file config receive.denyCurrentBranch ignore

5.5.2. git-daemon-sysvinit

for a read-only repo:

$ sudo apt-get install git-daemon-sysvinit$ dpkg -l git-daemon-sysvinitDesired=Unknown/Install/Remove/Purge/Hold| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)||/ Name                                   Version                  Architecture             Description+++-======================================-========================-========================-==================================================================================ii  git-daemon-sysvinit                    1:1.7.10.4-1ubuntu1      all                      fast, scalable, distributed revision control system (git-daemon service)$ dpkg -L git-daemon-sysvinit/./usr/usr/share/usr/share/git-core/usr/share/git-core/sysvinit/usr/share/git-core/sysvinit/sentinel/usr/share/doc/usr/share/doc/git-daemon-sysvinit/usr/share/doc/git-daemon-sysvinit/copyright/usr/share/doc/git-daemon-sysvinit/README.Debian/etc/etc/default/etc/default/git-daemon/etc/init.d/etc/init.d/git-daemon/usr/share/doc/git-daemon-sysvinit/changelog.Debian.gz

配置 /etc/default/git-daemon 文件

5.5.3. inet.conf / xinetd 方式启动

过程 5.2. git-daemon

  1. /etc/shells

    /etc/shells 最后一行添加 '/usr/bin/git-shell'

    $ grep git /etc/shells/usr/bin/git-shell
  2. add new user 'git' and 'gitroot' for git

    you need to assign shell with /usr/bin/git-shell

    $ sudo adduser git --shell /usr/bin/git-shell$ sudo adduser gitroot --ingroup git --shell /bin/bash

    /etc/passwd

    $ grep git /etc/passwdgit:x:1001:1002:,,,:/home/git:/usr/bin/git-shellgitroot:x:1002:1002:,,,:/home/gitroot:/bin/bash
  3. /etc/services

    $ grep 9418 /etc/servicesgit             9418/tcp                        # Git Version Control System
  4. /etc/inet.conf

    $ grep git /etc/inet.confgit     stream  tcp     nowait  nobody \  /usr/bin/git-daemon git-daemon --inetd --syslog --export-all /home/gitroot

    reload inetd

    $ sudo pkill -HUP inetd
  5. xinetd

    目前的Linux逐渐使用xinetd.d替代inet.conf,如Redhat系列已经不再使用inet.conf, Ubuntu系列发行版已经不预装inet与xinetd

    $ apt-cache search xinetdglobus-gfork-progs - Globus Toolkit - GFork Programsrlinetd - gruesomely over-featured inetd replacementupdate-inetd - inetd configuration file updaterxinetd - replacement for inetd with many enhancements$ sudo apt-get install xinetd

    /etc/xinetd.d/

    $ cat /etc/xinetd.d/git# default: off# description: The git server offers access to git repositoriesservice git{        disable 		= no        type            = UNLISTED        port            = 9418        socket_type     = stream        protocol 		= tcp        wait            = no        user            = gitroot        server          = /usr/bin/git        server_args     = daemon --inetd --export-all --enable=receive-pack --reuseaddr --base-path=/home/gitroot        log_on_failure  += USERID}

    reload xinitd

    $ sudo /etc/init.d/xinetd reload * Reloading internet superserver configuration xinetd                                       [ OK ]

5.5.4. git-daemon-run

$ sudo apt-get install git-daemon-run

安装后会创建下面两个用户

$ cat /etc/passwd | grep gitgitlog:x:117:65534::/nonexistent:/bin/falsegitdaemon:x:118:65534::/nonexistent:/bin/false

git-daemon-run 包携带的文件

$ dpkg -L git-daemon-run/./etc/etc/sv/etc/sv/git-daemon/etc/sv/git-daemon/run/etc/sv/git-daemon/log/etc/sv/git-daemon/log/run/usr/usr/share/usr/share/doc/usr/share/doc/git-daemon-run/usr/share/doc/git-daemon-run/changelog.gz/usr/share/doc/git-daemon-run/changelog.Debian.gz/usr/share/doc/git-daemon-run/README.Debian/usr/share/doc/git-daemon-run/copyright

同时创建下面配置文件

$ find /etc/sv/git-daemon//etc/sv/git-daemon//etc/sv/git-daemon/run/etc/sv/git-daemon/supervise/etc/sv/git-daemon/log/etc/sv/git-daemon/log/run/etc/sv/git-daemon/log/supervise

编辑/etc/sv/git-daemon/run配置

$ sudo vim /etc/sv/git-daemon/run#!/bin/shexec 2>&1echo 'git-daemon starting.'exec chpst -ugitdaemon \  "$(git --exec-path)"/git-daemon --verbose --reuseaddr \    --base-path=/var/cache /var/cache/git

git-daemon --verbose --reuseaddr \    --base-path=/var/cache /var/cache/git改为git-daemon --verbose --reuseaddr \	--enable=receive-pack --export-all --base-path=/opt/git
[提示] 提示

* 我加上了一个--export-all 使用该选项后,在git仓库中就不必创建git-daemon-export-ok文件。

其他选项--enable=upload-pack --enable=upload-archive --enable=receive-pack

/etc/services 文件中加入

# Local servicesgit             9418/tcp                        # Git Version Control System

确认已经加入

$ grep 9418 /etc/services

启动git-daemon

$ sudo sv stop git-daemonor$ sudo runsv git-daemonrunsv git-daemon: fatal: unable to change to directory: file does not exist

扫描git端口,确认git-daemon已经启动

$ nmap localhostStarting Nmap 5.00 ( http://nmap.org ) at 2012-01-31 10:45 CSTWarning: Hostname localhost resolves to 2 IPs. Using 127.0.0.1.Interesting ports on localhost (127.0.0.1):Not shown: 989 closed portsPORT     STATE SERVICE21/tcp   open  ftp22/tcp   open  ssh53/tcp   open  domain80/tcp   open  http111/tcp  open  rpcbind139/tcp  open  netbios-ssn445/tcp  open  microsoft-ds1723/tcp open  pptp3128/tcp open  squid-http3306/tcp open  mysql9418/tcp open  git

5.5.5. Testing

$ sudo mkdir -p /opt/git/example.git$ cd /opt/git/example.git$ git init$ sudo vim example.git/.git/config[receive]denyCurrentBranch = ignore$ sudo chown gitdaemon -R /opt/git/*$ touch git-daemon-export-ok

.git/config 文件应该是下面这样

$ cat example.git/.git/config[core]	repositoryformatversion = 0	filemode = true	bare = false	logallrefupdates = true[receive]denyCurrentBranch = ignore

git-clone git://localhost/example.git

neo@deployment:/tmp$ git clone git://localhost/example.git example.gitCloning into example.git...warning: You appear to have cloned an empty repository.neo@deployment:/tmp$ cd example.git/neo@deployment:/tmp/example.git$ echo helloworld > hello.txtneo@deployment:/tmp/example.git$ git add hello.txtneo@deployment:/tmp/example.git$ git commit -m 'Initial commit'[master (root-commit) 65a0f83] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 hello.txt

我们添加了一些文件 push 到服务器

$ git push origin masterCounting objects: 3, done.Delta compression using up to 2 threads.Compressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 214 bytes, done.Total 3 (delta 0), reused 0 (delta 0)To git://localhost/example.git * [new branch]      master -> master

然后再git clone,可以看到文件数目

$ git-clone git://localhost/example.gitCloning into example...remote: Counting objects: 3, done.remote: Compressing objects: 100% (2/2), done.remote: Total 3 (delta 0), reused 0 (delta 0)Receiving objects: 100% (3/3), done.

原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

你可能感兴趣的文章
Poj 水题
查看>>
php中关于mysqli和mysql区别的一些知识点分析
查看>>
Fiddler的基本介绍
查看>>
Mysql On Mac OS: Remove & Install
查看>>
莫烦大大keras学习Mnist识别(4)-----RNN
查看>>
STL之string插入
查看>>
分巧克力 蓝桥杯
查看>>
程序员总结:帮助你早些明白一些道理
查看>>
DI是实现面向切面和面向抽象的前提
查看>>
ABAP中TAB分隔符的使用
查看>>
smartforms初始化
查看>>
iOS buttonWithType:101 苹果私有api
查看>>
条款10:令operator=返回一个reference to *this
查看>>
单例模式
查看>>
.NET实现多个不同有效时间Session方案思考
查看>>
移动端常见问题及解决方案
查看>>
Github 使用的Markdown语言
查看>>
UVA 247 - Calling Circles (Floyd)
查看>>
Exchange: How to get Mailbox size in Exchange Shell?
查看>>
SqlBulkCopy使用心得
查看>>