知乎專欄 | 多維度架構 | 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者” |
在/home/gitroot/ 上運行 git 守護進程
$ cd /home/gitroot $ mkdir test.git $ cd test.git $ git --bare init --shared Initialized 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
for a read-only repo:
$ sudo apt-get install git-daemon-sysvinit $ dpkg -l git-daemon-sysvinit Desired=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 檔案
過程 176.2. git-daemon
/etc/shells
/etc/shells 最後一行添加 '/usr/bin/git-shell'
$ grep git /etc/shells /usr/bin/git-shell
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/passwd git:x:1001:1002:,,,:/home/git:/usr/bin/git-shell gitroot:x:1002:1002:,,,:/home/gitroot:/bin/bash
/etc/services
$ grep 9418 /etc/services git 9418/tcp # Git Version Control System
/etc/inet.conf
$ grep git /etc/inet.conf git stream tcp nowait nobody \ /usr/bin/git-daemon git-daemon --inetd --syslog --export-all /home/gitroot
reload inetd
$ sudo pkill -HUP inetd
xinetd
目前的Linux逐漸使用xinetd.d替代inet.conf,如Redhat系列已經不再使用inet.conf, Ubuntu系列發行版已經不預裝inet與xinetd
$ apt-cache search xinetd globus-gfork-progs - Globus Toolkit - GFork Programs rlinetd - gruesomely over-featured inetd replacement update-inetd - inetd configuration file updater xinetd - 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 repositories service 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 ]
$ sudo apt-get install git-daemon-run
安裝後會創建下面兩個用戶
$ cat /etc/passwd | grep git gitlog:x:117:65534::/nonexistent:/bin/false gitdaemon: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/sh exec 2>&1 echo '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 services git 9418/tcp # Git Version Control System
確認已經加入
$ grep 9418 /etc/services
啟動git-daemon
$ sudo sv stop git-daemon or $ sudo runsv git-daemon runsv git-daemon: fatal: unable to change to directory: file does not exist
掃瞄git連接埠,確認git-daemon已經啟動
$ nmap localhost Starting Nmap 5.00 ( http://nmap.org ) at 2012-01-31 10:45 CST Warning: Hostname localhost resolves to 2 IPs. Using 127.0.0.1. Interesting ports on localhost (127.0.0.1): Not shown: 989 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 53/tcp open domain 80/tcp open http 111/tcp open rpcbind 139/tcp open netbios-ssn 445/tcp open microsoft-ds 1723/tcp open pptp 3128/tcp open squid-http 3306/tcp open mysql 9418/tcp open git
$ 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.git Cloning 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.txt neo@deployment:/tmp/example.git$ git add hello.txt neo@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 master Counting 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.git Cloning 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.