Fork me on GitHub

分类 工具技巧 下的文章

使用SVN的8个技巧

1. 使用SVN钩子强制提交注释

一个好的SVN实践是文件提交时要求必须填写注释,并注明相关修改信息,如bug号、任务描述等,内容按照约定编写。这样在后期的代码审核和回溯过程中会非常方便,可以更快的定位到具体代码的修改记录。

所谓SVN钩子就是一些与版本库事件发生时触发的程序,例如新修订版本的创建,或者是未版本化属性的修改。目前subversion提供了如下几种钩子:start-commitpre-commitpost-commitpre-unlockpost-unlockpre-lockpost-lockpre-revprop-changepost-revprop-change,其中我们修改post-commit脚本即可实现强制提交注释的功能。

如下是一个实现强制提交注释的post-commit脚本例子:

REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | wc -m`

if [ "$LOGMSG" -lt 4 ]
then
    echo "拜托,写点注释吧!" 1>&2
    exit 1
fi

exit 0

2. 创建本地仓库

有时候我们在没有网络的情况下无法连接外网上的SVN仓库,或者没有条件搭建SVN服务,这时我们同样可以使用SVN管理我们自己的代码。我们可以使用TortoiseSVN在本地创建代码仓库,并进行代码的版本管理。具体步骤如下:

  1. 新建一个空文件夹,用于存放本地的代码仓库;
  2. 在这个空文件夹上点击右键 -> TortoiseSVN -> Create Respository here,创建仓库;
  3. 在另一个目录Checkout,本地SVN路径格式类似于:file:///C:Repo

3. SVN命令行操作

在Windows系统中TortoiseSVN是进行SVN代码管理的最佳利器,操作也非常简单方便。但是在一些特殊环境下,熟悉SVN命令行操作也是必须的,譬如想在一些自动化脚本程序中使用SVN的功能。 这里总结一些常用命令如下,更多命令请访问后面的参考链接:

(1) 从版本库获取信息

  • svn help
  • svn info $url
  • svn list
  • svn log
  • svn diff

(2) 从版本库到本地

  • svn [co|checkout] $url $local
  • svn export $url $local
  • svn [up|update]

(3) 从本地到版本库

  • svn import $local $url -m "some comments..."
  • svn add $file
  • svn delete $file
  • svn mv $oldfile $newfile
  • svn rm $url
  • svn [ci|commit]
  • svn revert $file 和 svn revert -R $dir

4. 更换版本比较工具

在进行SVN提交时需要非常谨慎,每次提交之前应先做SVN更新或与资源库同步,要特别注意SVN关于冲突和错误的提示信息。对每个提交的文件进行多次检查,确认它们是不是你真正想要提交的。

在提交的文件上选择Compare with base可以将本地代码和版本库中的代码进行比较,确保修改的内容无误。TortoiseSVN默认使用自带的TortoiseMerge工具进行代码比较,也可以更换其他的代码比较工具:在TortoiseSVN -> Settings -> Diff Viewer选项中找到Configure the program used for comparing different revisions of files,选择External,然后选择你喜欢的比较工具,如:Beyond Compare。

5. SVN服务器迁移

这条其实并不算SVN技巧,但是在我们日常工作中确实经常会遇到这样的情况,想将一台SVN服务器上的仓库迁移到另一台服务器。如果SVN服务器是一台Windows服务器,可以直接将SVN仓库目录复制到新服务器上,然后在新服务器上重启SVN服务即可。如果SVN服务器是linux服务器,可以通过下面的命令操作,将一台服务器上的目录拷贝到另一台服务器。

$ scp -r root@x.x.x.x:/home/svn /home/svn
$ svnserve -d -r /home/svn

在TortoiseSVN客户端,需要更新SVN地址:右键 -> TortoiseSVN -> Relocate...

6. svn:ignore

我们在用SVN提交代码时,常常有一些文件未版本化并且也不想提交,所以在提交时根本不想看到这些文件,譬如类似于Visual Studio工程的bin obj目录。

可以使用 svn propset svn:ignore 命令来将某个文件或目录添加到忽略列表中。可以在下面的链接中找到一些常见的ignore文件:Best general SVN Ignore Pattern?

7. SVN目录结构

Subversion有一个标准的目录结构,如下所示:

svn://projects/
|
+- trunck
+- branches
+- tags

其中,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。这几个目录具体怎么使用,svn并没有明确规范,一般有两种方式:trunk作为主开发目录或者trunk作为发布目录。

8. SVN使用原则

  • 代码变更及时提交,避免本地修改后无法修复;
  • 提交前确认代码可编译通过,保证新增的文件同时被提交;
  • 不要将格式修正和代码修改混合提交。修正格式包括增加缩进、减少空格等,如果把这些和代码修改一起提交,很难从日志信息中发现代码修正记录;
  • 每次提交尽量是一个最小粒度的修改,如果一次提交涉及到两个完全不同的功能,那么分两次提交,并在注释中写清楚提交内容;
  • 所有代码文件使用UTF-8格式;
  • 提交的文件必须是开发者公用的程序文件,不要提交私人测试程序、程序缓存、图片缓存、自动生成的文件等。

参考

  1. SVN之使用原则
  2. svn强制写日志和可以修改历史日志(svn钩子的应用)
  3. SVN搭建本地文件版本管理
  4. SVN 命令参考
  5. 关于SVN 目录结构
扫描二维码,在手机上阅读!

Windows+IIS+ASP.NET+SQL SERVER 出现50x错误的解决思路

最近一段时间服务器老是出现500、502或者503错误,由于数据量大了,访问用户增多,这类错误越来越影响正常业务。花了无数的时间排查问题,现做简单总结如下。如果你有新的建议,我会后续补上。 首先需要明确的是出现这类问题肯定是服务器错误,有可能是程序问题,也有可能是系统问题,要根据实际情况进行排查。在我遇到的情形中,我是按下列步骤进行排查的:

1. 首先打开任务管理器,查看内存占用

如果内存占用始终在95%上下,有可能是服务器上某个程序太耗内存导致内存不足。内存问题的排查情况比较多,可能是网站程序有内存泄露,也有可能是某个操作非常吃内存。
在我的服务器上,出现的问题是任务管理器里所有进程占用内存都不多,但是显示内存占用100%,在SQL SERVER中执行下面的SQL,确定是数据库缓存的问题。重启数据库,并为数据库设置最大占用内存可以解决这个问题。

select counter_name, ltrim(cntr_value*1.0/1024/1024)+'G' as memoryGB
from master.sys.dm_os_performance_counters
where counter_name like '%target%server%memory%'
    or counter_name like '%total%memory%'

-- Target Server Memory (KB) 服务器能够使用的动态内存总量。
-- Total Server Memory (KB) 从缓冲池提交的内存 (KB)。注意:这不是 SQL Server 使用的总内存。

2. 查看CPU占用

CPU占用100%同样可能会导致服务器出现50x错误,CPU问题的排查和内存问题一样,需要根据具体进程进行排查。在我的一次排查中,发现sqlservr.exe进程一直占用95%以上的CPU。进入SQL SERVER执行sp_who可以看到连接数很多,而且大多数状态都是suspended。使用下面的SQL语句可以查看当前正在执行的具体SQL。

SELECT
    [Spid] = session_Id,
    ecid,
    [Database] = DB_NAME(sp.dbid),
    [User] = nt_username,
    [Status] = er.status,
    [Wait] = wait_type,
    [Individual Query] = SUBSTRING(qt.text, er.statement_start_offset / 2,
        (CASE WHEN er.statement_end_offset = - 1
              THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
              ELSE er.statement_end_offset
         END - er.statement_start_offset) / 2),
    [Parent Query] = qt.text,
    Program = program_name,
    Hostname,
    nt_domain,
    start_time
FROM sys.dm_exec_requests er
INNER JOIN  sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt
WHERE session_Id > 50 /* Ignore system spids.*/ AND session_Id NOT IN (@@SPID)

结果显示正在执行很多相同的SQL,而且都是suspended状态。定位到具体的SQL语句,然后就是优化工作了,为该SQL添加索引后问题解决。

3. 检查IIS应用程序池是否正常运行

有时候IIS的应用程序池会异常退出,也会导致50x错误。应用程序池的退出很大一部分原因都是由于上面两个原因导致,要么是内存爆掉了,要么是CPU爆掉了,从而导致应用程序池崩溃这样的连锁反应。进入IIS->应用程序池,启动相应的程序池问题解决。

4. 检查数据库死锁

通过下面的SQL可以查看设置的死锁超时时间,如果LOCK_TIMEOUT值是-1,意味着如果遇到死锁则进程一直等待资源释放,这样就可能导致50x问题。可以将死锁的超时时间设置为3秒,则可以解决这类问题。具体的死锁原因还需要进一步分析。

SELECT @@LOCK_TIMEOUT
SET LOCK_TIMEOUT 3000

注意:LOCK_TIMEOUT值是程序级的设置(application-level setting),只对当前连接有效。在连接打开后,可以使用SET LOCK_TIMEOUT设置死锁超时时间。不能设置成全局的,如果想设置全局,可以使用CommandTimeout值代替。

参考链接:

1. 查询sqlserver 正在执行的sql语句的详细信息
2.SQL Server 性能调优(cpu)
3. 快速搞懂 SQL Server 的锁定和阻塞
4. SQL Server性能调优:资源管理之内存管理篇(上)

扫描二维码,在手机上阅读!