<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>N.S.thoughts &#187; git</title>
	<atom:link href="http://nightsailer.com/tag/git/feed" rel="self" type="application/rss+xml" />
	<link>http://nightsailer.com</link>
	<description>...silent is golden...</description>
	<lastBuildDate>Wed, 01 Sep 2010 17:01:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Nginx+mod_rails(Phusion Passenge)+redmine+gitosis的整合笔记</title>
		<link>http://nightsailer.com/2009/05/24/411.html</link>
		<comments>http://nightsailer.com/2009/05/24/411.html#comments</comments>
		<pubDate>Sun, 24 May 2009 10:30:48 +0000</pubDate>
		<dc:creator>nightsailer</dc:creator>
				<category><![CDATA[Technotes]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[gitosis]]></category>
		<category><![CDATA[mod_rails]]></category>
		<category><![CDATA[Passenge]]></category>
		<category><![CDATA[redmine]]></category>

		<guid isPermaLink="false">http://night9.cn/?p=411</guid>
		<description><![CDATA[个人使用Git很长时间了,感觉比subversion方便太多。因此，最近准备将团队的版本管理工具从subversion转向git.
周末花了点时间搭建了一个项目开发构建的环境:
版本管理使用git并用gitosis来搭建。
项目管理使用redmine。
部署:Nginx+Passenge(mod_rails)
中间出现了不少问题，做个笔记，以备后查:
一、安装Git/Gitosis环境
1.安装git
这部分没有什么问题
2.安装gitosis
git环境默认是可以直接使用的,但需要为每个成员开ssh权限帐号,且各个仓库之间的交叉权限管理很麻烦，
所以需要使用gitosis, 它无需为每个开发人员开设ssh帐号，安全方便。
我使用的机器还是Redhat EL4U3, 其中python的版本是2.3, gitosis并不兼容。
所以首先是安装一个独立的python26环境。
之后就简单了:
* 添加一个git用户，用它来运行gitosis,将其home设置为要存放git repositories的目录,注意将owner设置为git.
* clone gitosis

git clone git://eagain.net/gitosis.git
python setup.py install

* 上传你的ssh public key到服务器
scp ~/.ssh/id_rsa.pub root@xxx:/tmp/
* 用你的key初始化gitosis
sudo -H -u git gitosis-init < /tmp/id_rsa.pub
这将创建gitosis-admin 库,位于:
/repsository/gitosis-admin.git
gitosis将使用这个库进行用户和库权限的管理,由于其自身就是一个git repository,所以管理起来很方便:
修改post-update hook:
chmod a+x /repsository/gitosis-admin.git/hooks/post-update
现在服务端部署完毕.
git clone git@xxx:gitosis-admin.git
这将checkout/clone 到你本地.
现在将你的开发组成员的public key放到keys目录下,
格式为: user_name.pub , 如night.pub, little_zhang.pub.
然后,修改gitosis.conf:
[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = night
[group night-team]
members = night
writable = nginx-cache nginx-mirror
[group doggy-team]
members = night
writable = doggy doggy-passport
每个group是一个组,members是成员名,空格分隔, [...]]]></description>
			<content:encoded><![CDATA[<p>个人使用Git很长时间了,感觉比subversion方便太多。因此，最近准备将团队的版本管理工具从subversion转向git.<br />
周末花了点时间搭建了一个项目开发构建的环境:</p>
<p>版本管理使用git并用gitosis来搭建。<br />
项目管理使用redmine。<br />
部署:Nginx+Passenge(mod_rails)</p>
<p>中间出现了不少问题，做个笔记，以备后查:</p>
<p>一、安装Git/Gitosis环境<br />
1.安装git<br />
这部分没有什么问题</p>
<p>2.安装gitosis<br />
git环境默认是可以直接使用的,但需要为每个成员开ssh权限帐号,且各个仓库之间的交叉权限管理很麻烦，<br />
所以需要使用gitosis, 它无需为每个开发人员开设ssh帐号，安全方便。</p>
<p>我使用的机器还是Redhat EL4U3, 其中python的版本是2.3, gitosis并不兼容。<br />
所以首先是安装一个独立的python26环境。<br />
之后就简单了:<br />
* 添加一个git用户，用它来运行gitosis,将其home设置为要存放git repositories的目录,注意将owner设置为git.<br />
* clone gitosis<br />
<code><br />
git clone git://eagain.net/gitosis.git<br />
python setup.py install<br />
</code><br />
* 上传你的ssh public key到服务器<br />
scp ~/.ssh/id_rsa.pub root@xxx:/tmp/</p>
<p>* 用你的key初始化gitosis<br />
sudo -H -u git gitosis-init < /tmp/id_rsa.pub<br />
这将创建gitosis-admin 库,位于:<br />
<git_home>/repsository/gitosis-admin.git</p>
<p>gitosis将使用这个库进行用户和库权限的管理,由于其自身就是一个git repository,所以管理起来很方便:</p>
<p>修改post-update hook:<br />
chmod a+x <git_home>/repsository/gitosis-admin.git/hooks/post-update</p>
<p>现在服务端部署完毕.</p>
<p>git clone git@xxx:gitosis-admin.git</p>
<p>这将checkout/clone 到你本地.<br />
现在将你的开发组成员的public key放到keys目录下,<br />
格式为: user_name.pub , 如night.pub, little_zhang.pub.<br />
然后,修改gitosis.conf:</p>
<p>[gitosis]</p>
<p>[group gitosis-admin]<br />
writable = gitosis-admin<br />
members = night</p>
<p>[group night-team]<br />
members = night<br />
writable = nginx-cache nginx-mirror</p>
<p>[group doggy-team]<br />
members = night<br />
writable = doggy doggy-passport</p>
<p>每个group是一个组,members是成员名,空格分隔, writeable定义该组成员可以写入的repository.<br />
members对应的就是keys目录下的文件名(无pub后缀）。</p>
<p>修改后,提交并push到服务端:</p>
<p>git commit -m&#8217;setup users and access&#8217;<br />
git push</p>
<p>如何使用？<br />
现在，某个用户就可以创建一个repository并push到服务端了:<br />
假设night这个用户 要创建一个nginx-mirror仓库并push上去, 他需要这样做：</p>
<p>mkdir nginx-mirror<br />
git init<br />
touch .gitignore<br />
git commit -m&#8217;init commit&#8217;<br />
git remote add origin git@xxx:nginx-mirror.git<br />
git push &#8211;mirror</p>
<p>现在本地的nginx-mirror就和服务端的nginx-mirror.git同步了,之后就是正常的git日常管理流程:<br />
add,commit,branch,push&#8230;.</p>
<p>Git环境至此就告一段落。</p>
<p>二、安装部署Redmine</p>
<p><a href="http://www.redmine.org/">Redmine</a>是一个Rails项目,和Trac类似，但操作界面要比trac要简单方便很多. 包括项目管理中常用的模块：Issue, Timeline,<br />
Wiki,Files,Documents, 并且可以和Subversion,Git整合, 多数plugin都有中文的locale.</p>
<p>1. 安装Ruby<br />
最新的Ruby是1.9,但Rails2.2不支持，只能安装1.8<br />
2.安装Rails 2.2<br />
3. 安装mysql和其他可选模块,如RMagic<br />
4.Checkout最新的代码<br />
svn co svn://rubyforge.org/var/svn/redmine/trunk redmine</p>
<p>5. 配置数据库<br />
创建project数据库,并修改config/database.yml</p>
<p>6.Load数据库并插入初始数据<br />
rake config/initializers/session_store.rb<br />
rake db:migrate RAILS_ENV=&#8221;production&#8221;<br />
rake redmine:load_default_data RAILS_ENV=&#8221;production&#8221;</p>
<p>7. 创建并修改临时目录的权限<br />
mkdir tmp public/plugin_assets<br />
chmod -R 777 files log tmp public/plugin_assets</p>
<p>8.测试<br />
ruby script/server webrick -e production<br />
现在，3000端口就可以进入,默认的用户 admin/admin</p>
<p>9. 部署Redmine<br />
Redmine是一个rails应用, 所以如何部署是和普通rails一样, 我使用nginx+mod_rails方式,简单，高效。</p>
<p>安装 mod_rails（http://www.modrails.com/）<br />
gem install passenger</p>
<p>现在需要安装passenger的nginx模块, 其自带了一个passenger-install-nginx-module命令,<br />
可以自动编译并安装nginx，不过我嫌啰嗦，自己编译:<br />
cd /usr/local/src/nginx-0.7.58<br />
./configure  &#8211;with-http_stub_status_module  &#8211;with-http_gzip_static_module &#8211;add-module=&#8217;/usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/nginx&#8217;<br />
make install</p>
<p>现在修改nginx.conf:<br />
在http段加入:<br />
passenger_root /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2;</p>
<p>然后在虚拟主机启用passenger:<br />
server {<br />
        listen       80;<br />
        server_name  dev.xxx.com;<br />
        access_log  /logs/dev.access.log;<br />
        index  index.html;<br />
        passenger_enabled on;<br />
        root /project/redmine/public;<br />
}</p>
<p>现在重启nginx，访问上述域名即可.Passenge会自动监测并重启ruby进程.<br />
其他高级配置可以参考相应文档.</p>
<p>三、整合Gitosis和redmine<br />
这部分稍微有点小麻烦。<br />
1. 创建新项目,在版本库中SCM选择git,<br />
然后将gitosis的仓库位置填入.<br />
2. 刷新，并访问版本库模块，此时出错，显示没有相应的修订条目<br />
这个问题主要是由于gitosis创建的仓库的权限是750，而gitosis和redmine的运行<br />
用户不同.因此，需要将redmine的运行用户调成git，这样才能读取仓库的信息。<br />
感谢mod_rails(Passenge)， 它支持user switching, 由于redmine是rails程序，<br />
因此只需要改变config/environment.rb文件owner即可，mod_rails默认将该应用切换这个文件的owner:<br />
chown /project/redmine/config/environment.rb<br />
killall -HUP nginx</p>
<p>现在，可以在redmine中浏览版本库了.</p>
<p>3. Hack redmine支持branches/tags的浏览<br />
还有一个小问题，那就是默认的redmine的git插件只能浏览HEAD/master的信息，而无法查看branche/tags的信息，<br />
这是我不能容忍的。<br />
所以，需要对redmine打个<a href="http://night9.cn/wp-content/uploads/2009/05/redmine_git_branches.diff">补丁</a>.<br />
cd /project/redmine<br />
path -p1 < ../redmine_git_branches.diff<br />
killall -HUP nginx</p>
<p>现在重新刷新，wow!, 所有的分支和tag都能够浏览了，虽然还没有像github那样完美，但至少满足我的工作要求了。</p>
<p>这是我所使用的patch:<a href='http://night9.cn/wp-content/uploads/2009/05/redmine_git_branches.diff'>redmine_git_branches</a>，可以对现在trunk版本直接patch。<br />
=====================END===================</p>
]]></content:encoded>
			<wfw:commentRss>http://nightsailer.com/2009/05/24/411.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ProjectPlus无法显示git状态</title>
		<link>http://nightsailer.com/2009/04/06/409.html</link>
		<comments>http://nightsailer.com/2009/04/06/409.html#comments</comments>
		<pubDate>Mon, 06 Apr 2009 06:34:11 +0000</pubDate>
		<dc:creator>nightsailer</dc:creator>
				<category><![CDATA[Util]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[Textmate]]></category>

		<guid isPermaLink="false">http://night9.cn/?p=409</guid>
		<description><![CDATA[更新了git后，projectplus就无法支持git状态显示了,svn则正常。之前是自己编译的git，这次更新则使用了Git for OSX installer。区别在于后者默认install到/usr/local/git,看了下ProjectPlus的Libraries,自带了svn的运行库，没有git。看来是直接使用系统的git路径了。于是,将git做了一个symbol link：
ln -s /usr/local/git/bin/git /usr/local/bin/git
返回TextMate, 正常了,看来ProjectPlus是使用了绝对路径。
]]></description>
			<content:encoded><![CDATA[<p>更新了git后，projectplus就无法支持git状态显示了,svn则正常。之前是自己编译的git，这次更新则使用了<a href="http://night9.cn/2009/02/11/393.html">Git for OSX installer</a>。区别在于后者默认install到/usr/local/git,看了下ProjectPlus的Libraries,自带了svn的运行库，没有git。看来是直接使用系统的git路径了。于是,将git做了一个symbol link：</p>
<p>ln -s /usr/local/git/bin/git /usr/local/bin/git</p>
<p>返回TextMate, 正常了,看来ProjectPlus是使用了绝对路径。</p>
]]></content:encoded>
			<wfw:commentRss>http://nightsailer.com/2009/04/06/409.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Git for OSX installer</title>
		<link>http://nightsailer.com/2009/02/11/393.html</link>
		<comments>http://nightsailer.com/2009/02/11/393.html#comments</comments>
		<pubDate>Tue, 10 Feb 2009 17:31:23 +0000</pubDate>
		<dc:creator>nightsailer</dc:creator>
				<category><![CDATA[Util]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://night9.cn/?p=393</guid>
		<description><![CDATA[http://code.google.com/p/git-osx-installer/
以后不用自己编译了，省事.
OpenInGitGui还挺方便的,
虽然我一般在iTerm里用命令行,配合git complete脚本,也非常方便。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/git-osx-installer/">http://code.google.com/p/git-osx-installer/</a></p>
<p>以后不用自己编译了，省事.</p>
<p><a href="http://code.google.com/p/git-osx-installer/wiki/OpenInGitGui">OpenInGitGui</a>还挺方便的,<br />
虽然我一般在iTerm里用命令行,配合git complete脚本,也非常方便。</p>
]]></content:encoded>
			<wfw:commentRss>http://nightsailer.com/2009/02/11/393.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>开始使用git</title>
		<link>http://nightsailer.com/2008/03/11/217.html</link>
		<comments>http://nightsailer.com/2008/03/11/217.html#comments</comments>
		<pubDate>Tue, 11 Mar 2008 12:39:14 +0000</pubDate>
		<dc:creator>nightsailer</dc:creator>
				<category><![CDATA[Util]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://night9.cn/2008/03/11/217.html</guid>
		<description><![CDATA[配置管理工具用了不少,最初的CVS,后来切换成Subversion. 最近开始转换到git上.
Git是linus 为linux 内核写的一个分布式版本管理工具. 非常高效和灵活.
用subversion比较麻烦的一个是中央仓库服务器成为一个瓶颈.就我来说吧,白天在公司,
由于服务器在内部,速度还没有什么影响.晚上回家,当commit和update的时候就非常慢.
如果不commit,本地修改的东西就没有管理,有时候时间长了就麻烦, 尤其当你想作不同的尝试的时候,
需要创建一些branch.
Git则弥补了这些问题,作为一个分布式的版本管理,不依赖特定的中央仓库,任何一个节点完了都不影响
整体.
Git目前只有linux/unix版本,windows上可以用cygwin来安装. 对于那些迷恋GUI界面的人,GIT没有subversion
那么好的图形界面, Eclipse上的plugin也刚刚起步(不过基本功能都还全了).
不过git的命令都比较简单,用起来还是蛮顺手的.
我比较幸运,因为我用TextMate,TextMate作者似乎也比较喜欢git了,Textmate有一个比较好用的bundle,
安装很简单:

mkdir -p ~/Library/Application\ Support/TextMate/Bundles
cd !$
git clone git://gitorious.org/git-tmbundle/mainline.git Git.tmbundle
osascript -e 'tell app "TextMate" to reload bundles'

然后,在配置里增加一个TM_GIT的变量,指向你的git的所在.
git好用,不过其他的同事未必能够适应,所以我现在用git-svn配合.
把原来subversion的源码checkout出来形成本地的git仓库.
平时自己修改用git管理, 当需要合并的时候再提交到subvesion中形成新版本.
这里有一篇比较好的git中文教程.
DW上的教程:使用 Git 管理源代码(很初级)
Everyday GIT With 20 Commands Or So(很好很实用)
]]></description>
			<content:encoded><![CDATA[<p>配置管理工具用了不少,最初的CVS,后来切换成Subversion. 最近开始转换到git上.<br />
Git是linus 为linux 内核写的一个分布式版本管理工具. 非常高效和灵活.<br />
用subversion比较麻烦的一个是中央仓库服务器成为一个瓶颈.就我来说吧,白天在公司,<br />
由于服务器在内部,速度还没有什么影响.晚上回家,当commit和update的时候就非常慢.<br />
如果不commit,本地修改的东西就没有管理,有时候时间长了就麻烦, 尤其当你想作不同的尝试的时候,<br />
需要创建一些branch.<br />
Git则弥补了这些问题,作为一个分布式的版本管理,不依赖特定的中央仓库,任何一个节点完了都不影响<br />
整体.</p>
<p>Git目前只有linux/unix版本,windows上可以用cygwin来安装. 对于那些迷恋GUI界面的人,GIT没有subversion<br />
那么好的图形界面, Eclipse上的plugin也刚刚起步(不过基本功能都还全了).</p>
<p>不过git的命令都比较简单,用起来还是蛮顺手的.</p>
<p>我比较幸运,因为我用TextMate,TextMate作者似乎也比较喜欢git了,Textmate有一个比较好用的bundle,</p>
<p>安装很简单:<br />
<code><br />
mkdir -p ~/Library/Application\ Support/TextMate/Bundles<br />
cd !$<br />
git clone git://gitorious.org/git-tmbundle/mainline.git Git.tmbundle<br />
osascript -e 'tell app "TextMate" to reload bundles'<br />
</code><br />
然后,在配置里增加一个TM_GIT的变量,指向你的git的所在.</p>
<p>git好用,不过其他的同事未必能够适应,所以我现在用git-svn配合.<br />
把原来subversion的源码checkout出来形成本地的git仓库.<br />
平时自己修改用git管理, 当需要合并的时候再提交到subvesion中形成新版本.</p>
<p><a href="http://www.bitsun.com/documents/gittutorcn.htm">这里有一篇比较好的git中文教程.</a></p>
<p><a href="http://www.ibm.com/developerworks/cn/linux/l-git/index.html">DW上的教程:使用 Git 管理源代码(很初级)</a></p>
<p><a href="http://www.kernel.org/pub/software/scm/git/docs/everyday.html">Everyday GIT With 20 Commands Or So(很好很实用)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://nightsailer.com/2008/03/11/217.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
