一直从公司的服务器上用repo sync拉代码,今天得空,也想尝试着自己在本机上搭建个repo server试试。
上网搜了一堆教程。。。好多都是copy的,折腾了半天,终于成功,特此分享。Ubuntu12.04下亲测。
1. 之前写过一篇在本机搭建Git服务器的文章,当时是需要在Server里添加Client的ssh keygen信息,Client才能访问的,这次,借助与git-daemon ,配置之后,外部Client就都能访问了,首先在Ubuntu里安装 git-daemon:(我之前已经装好Git了)
$ sudo apt-get install git-daemon
2. 然后在主目录下新建文件夹 RepoServer 并进入:
$ mkdir /home/ritterliu/RepoServer
$ cd /home/ritterliu/RepoServer
3. 新建manifest.git,用来存放repo下载代码所依据的xml文件:
$ git init --bare manifest.git
4. 此时可以将想要被分享的被git管理的工程拷贝至此目录,例如,我将自己eclispe工作区里的AngryBird5和DLNA拷贝至此目录下:
$ cp -r /work/workSpace/AngryBird5 .
$ cp -r /work/workSpace/DLNA .
注意这两个工程都要被git管理,并提交过才行,也可以在此时进入工程,执行git init,git add,git commit操作。
5. 现在先放下这个目录不管,去配置下git-daemon的执行路径,需要root权限:
$ sudo su
# vi /etc/sv/git-daemon/run
将 /etc/sv/git-daemon/run 文件配置为如下内容
#!/bin/sh
exec 2>&1
echo 'git-daemon starting.'
exec chpst -ugitdaemon \
"$(git --exec-path)"/git-daemon --verbose --export-all --base-path=/home/ritterliu/
PS: 参数:--enable=receive-pack可以增加匿名用户的push权限(待验证)。
重启git-daemon:
# sv restart git-daemon
6. 然后在其他任意目录clone出manifest.git,此时为空,会clone出一个manifest空文件夹:
$ mkdir /home/ritterliu/clone
$ cd /home/ritterliu/clone
$ git clone [email protected]:/home/ritterliu/RepoServer/manifest.git
7. 进入manifest文件夹,并新建如下的default.xml文件:
$ vi default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="korg" fetch="git://192.168.10.1/RepoServer" review="review.source.android.com" />
<default revision="master" remote="korg" />
<project path="AngryBird5" name="AngryBird5" />
<project path="DLNA" name="DLNA" />
</manifest>
其中 fetch="git://192.168.10.1/RepoServer 中填本机的ip地址,project 处是刚才在/home/ritterliu/RepoServer中添加的想被分享的工程。
然后依旧是git add,git commit ,git push系列操作,最后一定要记得git push,把增加的default.xml变化push到manefest.git里:
$ git add .
$ git commit -a -m "add default.xml"
$ git push origin master
8. 此时,Server端就完全配置好了,去别的机子上,新建文件夹,下载repo,然后执行repo init即可:
$ mkdir /home/ubuntu/download
$ cd /home/ubuntu/download
curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > repo
$ chmod +x repo
$ ./repo init -u git://192.168.10.1/RepoServer/manifest.git
此处如果出现 fatal: unable to connect a socket (Connection refused) ,通常是在git-daemon或default.xml中配置路径出错。
最后同步下代码:
$ ./repo sync
如果出现 error: revision master in AngryBird5 not found ,应该是工程未commit过导致的。