Git diff使用Meld目录对比功能

虽然使用git difftool已经基本满足了我的需要,但还有个小问题:如果我要比较两次提交之间的差异时,difftool只能一个文件一个文件的比较,每次都要提示你是否打开这个文件,然后打开meld进行比较,当你关闭meld后,才会提示下一个差异文件。这样非常浪费效率。能不能直接利用meld的目录比较能力呢?

搜了一下,果然有人把脚本写好了: https://github.com/thenigan/git-diffall

下下来以后,进行如下配置:

现在试试 git diffall HEAD HEAD^1 ?

如果上述配置会遇到错误 “Expansion of alias ‘diffall’ failed; ‘/xxxx/git-diffall/git-diffall’ is not a git command”,最方便的解决方法就是创建一个软链接在你的PATH路径之一里,比如:

然后配置

Continue reading “Git diff使用Meld目录对比功能”

Git笔记

git配置
• /etc/gitconfig文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 –system 选项,读写的就是这个文件

• ~/.gitconfig文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 –global 选项,读写的就是这个文件

• 当前项目的 git 目录中的配置文件(也就是工作目录中的 .git/config 文件):
这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量

用户信息
git config –global user.name “John”
git config –global user.email john@johng.cn

文本编辑器
git config –global core.editor gedit

差异分析工具
git config –global merge.tool meld

查看配置信息要检查已有的配置信息
git config –list

输入一次后保存用户名和密码
git config –global credential.helper store

Continue reading “Git笔记”

创建、合并 Hg 分支

创建分支
Hg 的分支相对于 Git 没那么随意,如果要实现偏 Git 风格分支可以使用 bookmark 也就是书签功能

创建需要两步:

设置新的分支名称
commit
命令行方式如下(其中的 release 为将要创建的新分支名称):

如果使用 TortoiseHg 来实现的话:直接点击提交界面的『分支按钮』创建新的分支名称,然后『commit』即可

如要将本地新建的分支推送到远端的代码托管服务器上可以使用命令(使用 TortoiseHg Push 时其会自动代劳):

Continue reading “创建、合并 Hg 分支”

Linux下Mercurial (hg)配置说明

今天从源代码安装了mercurial,本来可以用命令很简单的安装:
sudo apt-get install mercurial,但是安装以后发现版本比较老,所以决定从源代码安装。

官方网站:http://mercurial.selenic.com/wiki/
下载下来解压缩以后,里面有个README文件,打开以后按照说明来:

Basic install:

$ make                  
$ make install   
$ hg debuginstall 
$ hg          

安装完成后执行 hg debuginstall 时出现了错误:

hg –version
abort: couldn\’t find mercurial libraries in [/usr/local/bin /usr/lib/python2.6 /usr/lib/python2.6/plat-linux2 /usr/lib/python2.6/lib-tk /usr/lib/python2.6/lib-old /usr/lib/python2.6/lib-dynload /usr/lib/python2.6/dist-packages /usr/lib/python2.6/dist-packages/PIL /usr/lib/python2.6/dist-packages/gst-0.10 /var/lib/python-support/python2.6 /usr/lib/python2.6/dist-packages/gtk-2.0 /var/lib/python-support/python2.6/gtk-2.0 /usr/local/lib/python2.6/dist-packages]
(check your install and PYTHONPATH)

解决方法:
export PYTHONPATH=/usr/local/lib/python2.4/site-packages
或者:
把上面的加到这两个文件中的一个: .bashrc、/etc/profile。然后就可以正常使用了。

 添加配置文件

此时再运行hg debuginstall ,会出现

Checking username…

no username supplied (see “hg help config”)

(specify a username in your .hgrc file)

1 problems detected, please check your install!

这是由于配置文件的原因

通过man hgrc会看到一些说明。默认是去一些位置找配置文件的。如果没有,就创建。源码中contrib文件夹下提供了一个sample.hgrc,可以拷贝过来修改

# cp sample.hgrc /root/.hgrc

# vim /root/.hgrc

这里改一下:

### show changed files and be a bit more verbose if True 

# verbose = True 

### username data to appear in comits

### it usually takes the form: Joe User <joe.user@host.com> 

username = Joe Who <j.user@example.com>

verbose = True 

### — Extensions

再运行hg debuginstall ,出现这个提示就可以了

Checking encoding (UTF-8)…

Checking extensions…

Checking templates…

Checking patch…

patching file hg-debuginstall-wCOuEs

Checking commit editor…

Checking username…

No problems detected

运行hg,出现

分布式软件配置管理工具 – 水银 (版本 1.5.0) 

版权所有 (C) 2005-2009 Matt Mackall <mpm@selenic.com> 和其他人。

这是自由软件,具体参见版权条款。这里没有任何担保,甚至没有适合

特定目的的隐含的担保。

REF: 

unixinstall

http://mercurial.selenic.com/wiki/UnixInstall

hgrc

http://www.selenic.com/mercurial/hgrc.5.html

这个工具在国内很少人使用,所以中文资料匮乏.只有官方的website上有一些少得可怜的中文资料了.不过总体上来说,hg还是比较好用的。

接下来开始 HG 的使用

1.建立用户hgrepo

其它用户将用这个账户用hg服务器push代码。

useradd hgrepo -d /home/hgrepo # add user hgrepo
passwd hgrepo

2.建立hg代码仓库

如果代码仓库名称为project.hg,则可用如下命令。

cd /home/hgrepo
mkdir project.hg
cd project.hg
hg init # 初始化代码仓库
建立一个测试文件

echo “hello, mercurial” > sample.txt
hg add  # add
hg ci     # check in

3. 打开http

打开一个端口,让远程用户可以clone仓库中的代码.
在打开端口前请确定文件权限正确。

更改文件权限
chown hgrepo.hgrepo /home/hgrepo/project.hg -R
chmod og+rw /home/hgrepo/project.hg -R
打开端口

cd  /home/hgrepo/project.hg -R
hg serve -p 8002 &
可将上面两行加入/etc/rc.local这样就可以在开机的时候自动运行了。

4.使用hg

完成步骤3以后,我们就可以使用了。

clone到本地

例如你的服务器的名字为test.

hg clone http://test:8002
然后在本地目录就会出现一个project.hg的一个copy.

修改Client端的配置

更改.hg/hgrc,加上default-push和username

[paths]
default = http://test:8002
default-push = ssh://hgrepo@test//home/hgrepo/project.hg/
[ui]
username=shaohui.zheng
这样你就可用hg push 向服务器提交code了。这时服务器会问你passward,这个password就是用户hgrepo的password.

Good Luck.

官方网站

http://www.selenic.com/mercurial/

另外还有个 Windows 下的客户端与其配合使用

TortoiseHg

http://www.oschina.net/p/tortoisehg

从技术到管理:思维转变是关键

IT公司研发部门的管理人员大多是从公司内部的技术人员中提拔的。在快速发展的公司里,这样的机会更多。然而这种“半路出家”的转型也给我们带来了很多挑战,其中最关键的部分在于思维方式的转变。

从个人成就到团队成就。无论是做管理还是做技术,成就导向意识是优秀员工的基本素质。只有具备很强的成就导向意识,才能把事情做得超预期,才能追求卓越。


刚刚上任的管理人员的思维方式往往还处于个人成就导向阶段,他们希望向外界发出一个明确的信号,团队之所以取得这样的成绩或者解决某个难题,是因为我的组织和领导。然而这种信号被团队成员多次接到后,会产生功劳都被领导拿走的感觉,从而导致团队的向心力下降。

这 时,比较好的做法是:要保护团队成员的成就导向,并且进行鼓励,从而刺激大家的积极性。例如,与某个团队成员共同解决了某个难题后,要弱化自己,重点表扬 这个团队成员对问题的贡献。这样再遇到某个难题时,这个团队成员才能保持一样或更高的激情。只有将自己的成就感定位在团队成就上,才能站得更高,避免和团 队成员产生直接竞争,从而有效地领导自己的团队。

上下同欲的氛围。兵法有云:“上下同欲者胜”。一个团队能够健康运作的基础就是“上下同欲”的氛围。要想拥有这种氛围,必须处理好两件事情:发言权和信息透明。

发言权:每个人都希望发表自己对某件事情的看法,尤其是比较关键的事情,并获得聆听。如果管理人员屏蔽这些,所表达的就是一种不尊重。当然不是所有的意见都要被采纳,需要需要合理的决策,但要让大家有发言的机会。

信息透明:这里的信息包括一切可以公开的信息,如上级期望和项目进展等。保持这些信息的透明度,能够提高团队成员对团队绩效的关注度和荣辱感。当大家都站在团队的高度上思考问题时,能够省去很多协调工作。

转型到管理岗位后,就要多花些时间来考虑团队建设问题。只有团队的氛围比较好,才有机会取得较好的成绩。

合理计划,要事第一。刚刚转型的管理人员往往会有类似这样的抱怨“杂事太多,被不停地打断”。造成这一问题的很大部分原因在于,计划不够周全或者缺乏例行 沟通机制。例如,每日站立例会基本上可以消除很多这样的杂事。同时因为管理人员需要接触的人比较多,所以日常处理的事情也会比较多。这与做技术人员有很大 不同。

这时就要有非常合理的计划,保证要事被及时处理。需要注意的是,时间的急迫性往往会夸大事情的重要性。如果管理人员总是习惯将任务拖到最后的截止时间处理,则会打乱事情的优先级,导致做事失去计划性。

培养人才,用人所长。杰克•韦尔奇说过:“在你成为领导之前,成功只同自己的成长有关。当你成为领导之后,成功同别人的成长有关。” 管理人员要把培养下属作为一件重要的事情,只有团队里的人才层出不穷,团队才有能力去不断挑战更高的目标。用人所长则指在工作的安排过程中需要多关注下属 的长处,不能过度放大他们的缺点。正所谓“用人所长,天下无不用之人;用人所短,天下无可用之人”。人事任命需谨慎考虑,用对一个人,能省很多心;用错一 个人,要操很多心。将合适的人放到合适的位置,是管理人员必须面对的一个难题。

Web代码审计工具大大全

Php Code Audits的方向

下面是一个Source Code Auditing tools的一个list[转于网络]

Name – [ language/s supported ] – web link:
.TEST – [ C#, VB.NET, MC++ ] – http://www.parasoft.com/jsp/products.jsp
ASTRéE – [ C ] – http://www.astree.ens.fr
Bandera – [ Java ] – http://bandera.projects.cis.ksu.edu/
BLAST – [ C ] – http://mtc.epfl.ch/software-tools/blast/
BOON – [ C ] – http://www.cs.berkeley.edu/~daw/boon/
C Code Analyzer (CCA) – [ C ] – http://www.drugphish.ch/~jonny/cca.html
C++test – [ C++ ] – http://www.parasoft.com/jsp/products.jsp
CCMetrics – [ C#, VB.NET ] – http://www.serviceframework.com/jwss/utility,ccmetrics,utility.aspx
Checkstyle – [ Java ] – http://checkstyle.sourceforge.net/
CodeCenter – [ C ] – http://www.ics.com/products/centerline/codecenter/features.html
CodeScan – [ .ASP, PHP ] – http://www.codescan.com/
CodeSecure – [ PHP, Java ] – http://www.armorize.com/corpweb/en/products/codesecure
CodeSonar – [ C, C++ ] – http://www.grammatech.com/products/codesonar/overview.html
CQual – [ C ] – http://www.cs.umd.edu/~jfoster/cqual
Csur – [ C ] – http://www.lsv.ens-cachan.fr/csur/
Dehydra – [ C++ ] – http://wiki.mozilla.org/Dehydra_GCC
DevInspect – [ C#, Visual Basic, JavaScript, VB Script] – http://www.spidynamics.com/products/devinspect/
DevPartner SecurityChecker – [ C#, Visual Basic ] – http://www.compuware.com/products/devpartner/securitychecker.htm
DoubleCheck – [ C, C++ ] – http://www.ghs.com/products/doublecheck.html
FindBugs – [ Java ] – http://findbugs.sourceforge.net/
FlawFinder – [ C, C++ ] – http://www.dwheeler.com/flawfinder/
Fluid – [ Java ] – http://www.fluid.cs.cmu.edu/
Frama-C – [ C ] – http://frama-c.cea.fr/
ftnchek – [ FORTRAN ] – http://www.dsm.fordham.edu/~ftnchek/
FxCop – [ .NET ] – http://code.msdn.microsoft.com/codeanalysis
g95-xml – [ FORTRAN ] – http://g95-xml.sourceforge.net/
ITS4 – [ C, C++ ] – http://www.cigital.com/its4/
Jlint – [ Java ] – http://artho.com/jlint/
JsLint – [ JavaScript ] – http://www.jslint.com/
Jtest – [ Java ] – http://www.parasoft.com/jsp/products.jsp
KlocWork / K7 – [ C, C++, Java ] – http://www.klocwork.com/products/k7_security.asp
LAPSE – [ Java ] – http://www.owasp.org/index.php/Category:OWASP_LAPSE_Project
MOPS – [ C ] – http://www.cs.berkeley.edu/~daw/mops/
MSSCASI – [ ASP ] – http://www.microsoft.com/downloads/details.aspx?FamilyId=58A7C46E-A599-4FCB-9AB4-A4334146B6BA&displaylang=en
MZTools – [ VB6, VBA ] – http://www.mztools.com/index.aspx/
Oink – [ C++ ] – http://www.cubewano.org/oink
Ounce – [ C, C++, Java, JSP, ASP.NET, VB.NET, C# ] – http://www.ouncelabs.com/accurate-complete-results.html
Perl-Critic – [ Perl ] – http://search.cpan.org/dist/Perl-Critic/
PLSQLScanner 2008 – [ PLSQL ] – http://www.red-database-security.com/software/plsqlscanner.html
PHP-Sat – [ PHP ] – http://www.program-transformation.org/PHP/PhpSat
Pixy – [ PHP ] – http://pixybox.seclab.tuwien.ac.at/pixy/index.php
PMD – [ Java ] – http://pmd.sourceforge.net/
PolySpace – [ Ada, C, C++ ] – http://www.polyspace.com/products.htm
PREfix & PREfast – [ C, C++ ] – http://support.microsoft.com/vst
Prevent – [ C, C++ ] – http://www.coverity.com/html/coverity-software-quality-products.html
PyChecker – [ Python ] – http://pychecker.sourceforge.net/
pylint – [ Python ] – http://www.logilab.org/project/pylint
QA-C, QA-C++, QA-J – [ C, C++, Java, FORTRAN ] – http://www.programmingresearch.com/PRODUCTS.html
QualityChecker – [ Visual Basic 6 ] – http://d.cr.free.fr/
RATS – [ C, C++, Perl, PHP, Python ] – http://www.fortify.com/security-resources/rats.jsp
RSM – [ C, C++, C#, Java ] – http://msquaredtechnologies.com/m2rsm/
Smatch – [ C ] – http://smatch.sourceforge.net/
SCA – [ ASP.NET, C, C++, C#, Java, JSP, PL/SQL, T-SQL, VB.NET, XML ] – http://www.fortifysoftware.com/products/sca/
Skavenger – [ PHP ] – http://code.google.com/p/skavenger/
smarty-lint – [ PHP ] – http://code.google.com/p/smarty-lint/
soot – [ Java ] – http://www.sable.mcgill.ca/soot/
Source Monitor – [ C#, VB.NET ] – http://www.campwoodsw.com/sm20.html
SPARK – [ Ada ] – http://www.praxis-his.com/sparkada/spark.asp
Spike PHP Security Audit Tool – [ PHP ] – http://developer.spikesource.com/projects/phpsecaudit/
Splint – [ C ] – http://www.splint.org/
SWAAT – [ PHP, ASP.NET, JSP, Java ] – http://www.owasp.org/index.php/Category:OWASP_SWAAT_Project
UNO – [ C ] – http://spinroot.com/uno/“>
vil – [ C#, VB.NET ] – http://www.1bot.com/
Viva64 – [ C++ ] – http://www.viva64.com/
xg++ – [ C ] – http://www.stanford.edu/~engler/mc-osdi.pdf

YTKScan Java – [ Java ] – http://www.cam.org/~droujav/y2k/Y2KScan.html
 

支持php的有:

CodeScan – [ .ASP, PHP ] – http://www.codescan.com/
CodeSecure – [ PHP, Java ] – http://www.armorize.com/corpweb/en/products/codesecure
PHP-Sat – [ PHP ] – http://www.program-transformation.org/PHP/PhpSat
Pixy – [ PHP ] – http://pixybox.seclab.tuwien.ac.at/pixy/index.php
RATS – [ C, C++, Perl, PHP, Python ] – http://www.fortify.com/security-resources/rats.jsp
Skavenger – [ PHP ] – http://code.google.com/p/skavenger/
smarty-lint – [ PHP ] – http://code.google.com/p/smarty-lint/
Spike PHP Security Audit Tool – [ PHP ] – http://developer.spikesource.com/projects/phpsecaudit/
SWAAT – [ PHP, ASP.NET, JSP, Java ] – http://www.owasp.org/index.php/Category:OWASP_SWAAT_Project

另外还有一个Fortify – http://www.fortifysoftware.com [如果还有,请帮忙补充]

目 前就php的Source Code Auditing tool基本都是静态分析的,而Source Code Auditing一直围绕着2个元素:变量和函数.也就是说这些tools不管是php开发的还是java开发的,也不管是不是基于php原代码的,他本 身都对一些危险的函数和变量都对应的一个’字典'[特征字符串],这些tools都是通过查找这些字典,然后跟踪变量来分析代码.

但是随着程序员安全意识的提高,很多的程序员也知道了这些’字典’了,都有对应的过滤,所以那些传统的问题,很找在大型程序里出现了.所以只有通过扩大我们的字典才有更多的机会去找到应用程序的漏洞.我们的途径有:

* 分析和学习别人发现的漏洞或者exp,如大牛Stefan Esser发现的那些问题,rgod等以前发的那些exp
* 通过学习php手册或者官方文档了解php 一些函数的’特性’
* fuzz php的函数,找到新的有问题的函数[不一定非要溢出的]
* 分析php源代码,发现新的漏洞函数’特性’或者漏洞
* 有条件或者机会和开发者学习,找到他们实现某些常用功能的代码的缺陷或者容易忽视的问题
* 你有什么要补充的吗? 🙂
from:http://hi.baidu.com/hi_heige/blog/item/2ac6ab003fea1105738da5a3.html

公司SVN版本提交钩子post-commit.bat

  1. SET REPOS=%1  
  2. SET REV=%2  
  3. SET SVN_HOME_BIN=C:\svnServer\bin\  
  4. SET SVNUpdatePath=E:\svnupdate\gamebto\update\gamebto_new  
  5. SET VERPath=E:\svnupdate\gamebto\version\%date:~0,4%-%date:~5,2%-%date:~8,2%  
  6. SET WEBPath=E:\web\gamebto  
  7. SET WEBPath2=\\192.168.14.16\web\gamebto  
  8. SET WEBPath3=\\192.168.14.78\web\gamebto  
  9. SET WEBPath4=\\192.168.14.80\web\gamebto  
  10. SET ChangeList=E:\svnupdate\gamebto\logs\%date:~0,4%.%date:~5,2%.%date:~8,2%_%REV%.txt  
  11. %SVN_HOME_BIN%svnlook changed %REPOS% > %ChangeList%  
  12. %SVN_HOME_BIN%svn update %SVNUpdatePath%  
  13. E:  
  14. FOR /F “eol=; tokens=1 delims=” %%a in (%ChangeList%) do (FOR /f “tokens=1,2,* delims= “  %%i in (“%%a”do IF %%i==D (DEL %VERPath%%%~pnxj|DEL %WEBPath%%%~pnxj|DEL %WEBPath2%%%~pnxj) ELSE (echo f| xcopy %SVNUpdatePath%%%~pnxj %VERPath%%%~pnxj /R /Y /C|echo f| xcopy %SVNUpdatePath%%%~pnxj %WEBPath%%%~pnxj /R /Y /C|echo f| xcopy %SVNUpdatePath%%%~pnxj %WEBPath2%%%~pnxj /R /Y /C|echo f| xcopy %SVNUpdatePath%%%~pnxj %WEBPath3%%%~pnxj /R /Y /C|echo f| xcopy %SVNUpdatePath%%%~pnxj %WEBPath4%%%~pnxj /R /Y /C)); 

Subversion服务详细配置

Subversion安装成service

 以前的svnserve要想成为windows服务,必须依赖于svnservice或其他工具。从Subversion1.4开始,Subversion本身就集成Windows服务的工具。

1,安装svnservice

 在Windows NT中(包括Windows XP, Windows 2000, Windows 2003 Server)本身包含了一个安装服务的工具,叫做”Service Control”,也就是sc.exe。

例如我的Subversion安装在”D:\Subversion”,版本库在”D:\svnroot”,而我希望对应的Subversion服务名为svnservice,安装这个svn服务的命令就可以这样写:

sc create svnservice
binpath= “D:\Subversion\bin\svnserve.exe –service -r D:\svnroot”
displayname= “SVNService”
depend= Tcpip

请注意,因为便于察看,上面的命令分为多行,但在实际执行时应该在一行里。另外,在以前启动svnserve时会使用”-d”选项,也就是守护进程模式,在这里不能使用,会导致服务无法启动。同样,”-i”和”-t”选项也不能使用。

在命令行窗口执行完这个命令之后,服务还没有启动,你可以继续运行”net start svnservice”启动这个服务,然后使用”net stop svnservice”停止服务。

另外还有两点需要小心处理。首先,如果路径中包括空格,一定要用“\”处理“””号,例如上面的例子中如果 svnserve.exe在“c:\program files\subversion\”中,则命令应该写为“binpath= “\”c:\program files\subversion\bin\svnserve.exe\””(“”中的内容),整个命令如下,红色部分是改变部分:

sc create svnservice
binpath= “\”D:\program files\Subversion\bin\svnserve.exe\” –service -r D:\svnroot”
displayname= “SVNService”
depend= Tcpip

其次,sc对选项的格式还有要求,例如“depend= Tcpip”不能写为“depend = Tcpip”或“depend=Tcpip”,也就是“=”前不能有空各,而后面必须有空格。

2,删除服务

 如果服务安装的有问题,你可能需要删除服务。要删除前面添加的服务,只需要运行”net start svnservice”,”svnservice”就是我们创建服务时使用的名字。

3,配置服务是自动启动

 默认情况下安装的服务不会随Windows的启动而启动,为了使svn服务能够随Windows启动而启动,需要修改一下”sc create”命令(首先要删除),增加”start= auto”选项:

sc create svnservice
binpath= “D:\Subversion\bin\svnserve.exe –service -r D:\svnroot”
displayname= “SVNService”
depend= Tcpip
start= auto

当然你也可以使用图形化的工具修改服务的属性,你可以在“开始->运行…”中执行”services.msc”,然后在界面中修改。

Subversion的权限控制

 1,认证(Authentication)和授权(Authorization)

 这两个术语经常一起出现。其中认证的意思就是鉴别用户的身份,最常见的方式就是使用用户名和密码,授权就是判断用户是否具备某种操作的权限,在 Subversion里提供了“authz-db”文件,实现了以路径为基础的授权,也就是判断用户是否有操作对应路径的权限,在Subversion 1.3之后,svnserve和Apache一样都可以使用“authz-db”文件。

2. svnserve下的配置文件

 因为本文是以svnserve为例的,所以先介绍一下版本库目录的结构:

D:\SVNROOT\PROJECT1
├─conf
├─dav
├─db
│ ├─revprops
│ ├─revs
│ └─transactions
├─hooks
└─locks

其中conf下面有三个文件:

authz
passwd
svnserve.conf

其中的“svnserve.conf”是这个版本库的配置文件,当使用svnserve时,这个配置文件决定了使用什么认证和授权文件:

password-db = passwd
authz-db = authz

上面的配置说明使用“svnserve.conf”同目录的passwd和authz,其中的password-db指定了用户密码文件,authz-db是我们的授权文件,也就是我们本文主要介绍的文件。

注意:使用Apache作为服务器时,根本就不会参考“svnserve.conf”文件的内容,而是会参考Apache的配置。

3,基于svnserve的版本库文件布局

 使用svnserve时,为了管理的方便,应该使用相同的认证和授权文件,所以应该让所有版本库的配置文件svnserve.conf指向同一个password-db和authz-db文件。下面是一个多版本库的目录:

D:\SVNROOT
├─project1
│ ├─conf
│ ├─dav
│ ├─db
│ │ ├─revprops
│ │ ├─revs
│ │ └─transactions
│ ├─hooks
│ └─locks
└─project2
├─conf
├─dav
├─db
│ ├─revprops
│ ├─revs
│ └─transactions
├─hooks
└─locks

D:\SVNROOT下有两个目录project1和project2,都已经创建了版本库,所以我们修改每个conf目录下的svnserve.conf,使之指向同一个password-db和authz-db文件。

password-db = ..\..\passwd

 authz-db = ..\..\authz这样,D:\SVNROOT\passwd和D:\SVNROOT\authz就控制了所有版本库的svnserve访问。另外在 后面的操作中要关闭匿名访问,应该去掉“anon-access = none”前的“#”号,保证只有认证用户可以访问。

注意:还有一点需要注意,那就是svnserve的“realm”的值,在上面的设置下,应该保证所有的版本库使用相同的realm值,这样,对版本库的密码缓存可以在多个版本库之间共享,更多细节见客户端凭证缓存。

4,测试用户和组说明

 版本库禁止任何匿名用户的访问,只对认证用户有效。

root:配置管理管理员,对版本库有完全的管理权限。

p1_admin1:project1的管理员,对project1有完全权限。
 p1_d1:project1的开发者,对project1的trunk有完全的权限,但是对其中的/trunk/admin目录没有任何权限。
 p1_t1:project1的测试者,对project1的trunk有完全的读权限,但是对其中的/trunk/admin目录没有任何权限。

p2_admin1:project2的管理员,对project2有完全权限。
 p2_d1:project2的开发者,对project2的trunk有完全的权限,但是对其中的/trunk/admin目录没有任何权限。
 p2_t1:project2的测试者,对project2的trunk有完全的读权限,但是对其中的/trunk/admin目录没有任何权限。

对应的组及组的用户:

p1_group_a:p1_admin1
p1_group_d:p1_d1
p1_group_t:p1_t1
p2_group_a:p2_admin1
p2_group_d:p2_d1
p2_group_t:p2_t1

5,修改D:\SVNROOT\passwd文件

前面已经说过了,用户和密码文件应该是在D:\SVNROOT\passwd,所以我们为每一位用户设置权限,文件内容如下:

[users]
p1_admin1 = p1_admin1
p1_d1 = p1_d1
p1_t1 = p1_t1

p2_admin1 = p2_admin1
p2_d1 = p2_d1

p2_t1 = p2_t1为了便于验证,所有密码和用户名一致,如果你使用的是其他认证方式,这一步可能不同,但是用户名应该都是一样的。

6,配置授权,修改D:\SVNROOT\authz

[groups]
# 定义组信息

p1_group_a = p1_admin1
p1_group_d = p1_d1
p1_group_t = p1_t1

p2_group_a = p2_admin1
p2_group_d = p2_d1
p2_group_t = p2_t1

[/]
# 指定所有的版本库默认只读,root可读写
* = r
root = rw

[project1:/]
# 指定对版本库project1根目录的权限
@p1_group_a = rw
@p1_group_d = rw
@p1_group_t = r

[project1:/trunk/admin]
# 指定对版本库project1的/trunk/admin根目录的权限,
# p1_group_a读写,p1_group_d和p1_group_t没有任何权限。
@p1_group_a = rw
@p1_group_d =
@p1_group_t =

[project2:/]
# 指定对版本库project2根目录的权限
@p2_group_a = rw
@p2_group_d = rw
@p2_group_t = r

[project2:/trunk/admin]
# 指定对版本库project1的/trunk/admin根目录的权限
@p2_group_a = rw
@p2_group_d =
@p2_group_t =

经过以上设置以后,你会发现一些有趣的事情。当使用用户“p1_d1”,检出project1的trunk时,目录是空的,好像admin目录根本不存在一样,当使用p1_d1用户浏览版本库时,能够看到admin目录,但是其中的内容却无法看到。

关 于中文目录,也是没有问题的,只是注意要把authz文件转化为UTF-8格式,在我的WINXP的UltraEdit里显示的文件格式为U8-DOS, 具体的做法是用UltraEdit打开authz文件,然后选择“文件->转换->ASCII转UTF-8”,然后保存。

再复杂的情况也不过如此,在实际的工作中要首先规划好权限,只赋给用户最小的权限,保证以最小的配置实现最复杂的权限控制。

Subversion备份

 版本控制最关键的一件事是保证数据的安全性,不能因为磁盘损坏,程序故障造成版本库无可挽回的错误,为此必须制定较完备的备份策略。在Subversion中,我们有三种备份方式:完全备份,增量备份和同步版本库。

1, 完全备份

 最常见和简单的备份就是直接使用拷贝命令,将版本库目录拷贝到备份目录上,就可以了。但是这样不是很安全的方式,因为如果在拷贝时版本库发生变化,将会 造成备份的结果不够准确,失去备份的作用,为此Subversion提供了“svnadmin hotcopy”命令,可以防止这种问题。

还记得我们的版本库目录吗?

D:\SVNROOT
├─project1
│ ├─conf
│ ├─dav
│ ├─db
│ │ ├─revprops
│ │ ├─revs
│ │ └─transactions
│ ├─hooks
│ └─locks
└─project2
├─conf
├─dav
├─db
│ ├─revprops
│ ├─revs
│ └─transactions
├─hooks
└─locks

如果要把project1备份到d:\svnrootbak目录下,只需要运行:

svnadmin hotcopy d:\svnroot\project1 d:\svnrootbak\project1

但是我们作为配置管理员,必须想办法优化这个过程,如果我们这个目录下有许多版本库,需要为每个版本库写这样一条语句备份,为此我写了下面的脚本,实现备份一个目录下的所有版本库。我们在D:\SVNROOT下创建了两个文件,simpleBackup.bat:

@echo 正在备份版本库%1……
 @%SVN_HOME%\bin\svnadmin hotcopy %1 %BACKUP_DIRECTORY%\%2
 @echo 版本库%1成功备份到了%2!

这个文件仅仅是对“svnadmin hotcopy”的包装,然后是backup.bat:

echo off

rem Subversion的安装目录
set SVN_HOME=”D:\Subversion”

rem 所有版本库的父目录
set SVN_ROOT=D:\svnroot

rem 备份的目录
set BACKUP_SVN_ROOT=D:\svnrootbak

set BACKUP_DIRECTORY=%BACKUP_SVN_ROOT%\%date:~0,10%
if exist %BACKUP_DIRECTORY% goto checkBack
echo 建立备份目录%BACKUP_DIRECTORY%>>%SVN_ROOT%/backup.log

mkdir %BACKUP_DIRECTORY%

rem 验证目录是否为版本库,如果是则取出名称备份
for /r %SVN_ROOT% %%I in (.) do @if exist “%%I\conf\svnserve.conf” %SVN_ROOT%\simpleBackup.bat “%%~fI” %%~nI
goto end

:checkBack
echo 备份目录%BACKUP_DIRECTORY%已经存在,请清空。
goto end

:end

你 在使用的时候,只需要修改backup.bat开头的三个路径,将两个脚本拷贝到“SVN_ROOT”下就可以了。根据以上的配置,你只需要运行 backup.bat,就可以把“SVN_ROOT”下的版本库都备份到“BACKUP_SVN_ROOT”里,并且存放在备份所在日的目录里,例如 “D:\svnrootbak\2006-10-22”。

虽然这部分工作很简单,可是必须有人定时地去执行这个操作(例如每周一凌晨),为了避免发生遗忘的情况,我们可以将这个操作加入到系统的at任务当中去,例如还是上面的环境,为了安装at任务,我们运行:

at 1:00 /every:M D:\svnroot\backup.bat这样在每周一凌晨1:00都会执行这个备份过程。当然备份在本机也是不安全的,你也许需要上传到别的机器,这个就要靠你自己去实现了。

2, 增量备份

 尽管完全备份非常简单,但是也是有代价的,当版本库非常巨大时,经常进行完全备份是不现实的,也并不必要,但是一旦版本库在备份之间发生问题,该如何呢,这里我们就用到了增量备份。

增量备份通常要与完全备份结合使用,就像oracle数据库的归档日志,记录着每次Subversion提交的变 化,然后在需要恢复时能够回到最新的可用状态。在我们这个例子中我们使用的是,svnadmin dump命令进行增量的备份,使用方法是:

svnadmin dump project1 –revision 15 –incremental > dumpfile2

上面的命令实现了对修订版本15进行增量的备份,其中的输出文件dumpfile2只保存了修订版本15更改的内容。

为了记录每次提交的结果,我们需要使用一项Subversion的特性–钩子(hook),看看我们的project1目录:

├─project1
│ ├─conf
│ ├─dav
│ ├─db
│ │ ├─revprops
│ │ ├─revs
│ │ └─transactions
│ ├─hooks
│ └─locks

其中的hooks目录里存放的就是钩子脚本,我们在此处只使用post-commit钩子,这个钩子会在每次提交之后执行,为了实现我们的备份功能,我们在hooks下建立一个文件post-commit.bat,内容如下:

echo off
set SVN_HOME=”C:\Program Files\Subversion”
set SVN_ROOT=D:\svnroot
set UNIX_SVN_ROOT=D:/svnroot
set DELTA_BACKUP_SVN_ROOT=D:\svnrootbak\delta
set LOG_FILE=%1\backup.log
echo backup revision %2 >> %LOG_FILE%
for /r %SVN_ROOT% %%I in (.) do if D:/svnroot/%%~nI == %1 %SVN_ROOT%\%%~nI\hooks\deltaBackup.bat %%~nI %2
goto end
:end

通过这个脚本,可以实现D:\svnroot下的版本库提交时自动增量备份到D:\svnrootbak \delta(确定这个目录存在),其中使用的deltaBackup.bat其实可以放在任何地方,只是对脚本的svnadmin dump的包装,内容如下:

@echo 正在备份版本库%2……
 %SVN_HOME%\bin\svnadmin dump %SVN_ROOT%\%1 –incremental –revision %2 >> %DELTA_BACKUP_SVN_ROOT%\%1.dump
 @echo 版本库%2成功备份到了%3!

以上两个脚本可以直接拷贝到project2的hooks目录下,不需要修改就可以实现project2的自动备份。

以上的操作已经OK了,现在需要做的是将完全备份和增量备份结合起来,也就是在完全备份后清理增量备份的结果,使之只保存完全备份后的结果。

当果真出现版本库的故障,就要求我们实现版本库的恢复操作了,这是用要使用svnadmin load命令,同时也需要上次的完全备份例如要把上次完全备份backuprepo,和之后的增量备份dumpfile:

svnadmin load backuprepo < dumpfile

最后的结果,可以下载svnroot.rar,将之解压缩到d:\下,然后修改几个bat文件的SVN_HOME就可以使用了。

3, 版本库同步

Subversion 1.4增加了同步机制,可以实现一个版本库同另一个版本库的同步(但好像只是单向的),我们可以用来实现版本库的备份或镜像。

3.1. 对目标库初始化

 svnsync init svn://localhost/project2 svn://localhost/project1
 其中project2是目标的版本库,而project1是源版本库。其中的目标版本库必须为空,而且必须允许修订版本属性的修改,也就是在目标的版本 库的hooks目录里添加一个文件pre-revprop-change.bat,内容为空即可。

3.2. 同步project2到project1

 svnsync sync svn://localhost/project2
 这时候你update一下你的project2的一个工作拷贝,就会发现有了project1的所有内容。如果project1又有提交,这时候 project2的版本库无法看到最新的变化,还需要再运行一遍sync操作,这样才能将最新的变化同步。需要注意的是,目标版本库只能做成只读的,如果 目标版本库发生了变更,则无法继续同步了。

3.3. 同步历史属性的修改

 因为同步不会更新对历史属性的修改,所以svnsync还有子命令copy-revprops,可以同步某个版本的属性。

3.4. 钩子自动同步

 希望在每次提交时同步,则需要在源版本库增加post-commit脚本,内容如下:

echo off
set SVN_HOME=”D:\Subversion”
%SVN_HOME%\bin\svnsync sync –non-interactive svn://localhost/project2

把以上内容存放为post-commit.bat,然后放到版本库project1下的hooks目录下,这样project1每次提交,都会引起project2的同步。

Cannot load */modules/mod_dav_svn.so into server: \xd5\xd2\…

按照TortoiseSVN的帮助文档安装SVN服务器,结果出现了
httpd.exe: Syntax error on line 561 of D:/ENV/Apache2.2/conf/httpd.conf: Cannot load D:/ENV/Apache2.2/modules/mod_dav_svn.so into server: \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3 
这样的错误。

其实不是.so文件的错,只是复制到Apache/bin下的DLL文件少了,将Subversion的所有DLL文件复制过去就行了。