<?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>绿色记忆 &#187; svn</title>
	<atom:link href="https://blog.gmem.cc/tag/svn/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Sun, 19 Apr 2026 07:54:29 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>Ubuntu下安装subversion服务器</title>
		<link>https://blog.gmem.cc/subversion-server-under-ubuntu</link>
		<comments>https://blog.gmem.cc/subversion-server-under-ubuntu#comments</comments>
		<pubDate>Sun, 27 May 2012 13:31:32 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1174</guid>
		<description><![CDATA[<p>安装必要的软件: [crayon-69e5e1f3104d6243457256/]  配置subversion服务器： [crayon-69e5e1f3104dd949799439/]  启动服务器： [crayon-69e5e1f3104e0197058169/]  设置为开机自动启动： [crayon-69e5e1f3104e2154792425/] &#160; [crayon-69e5e1f3104e4218869279/]</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/subversion-server-under-ubuntu">Ubuntu下安装subversion服务器</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><p><strong>安装必要的软件:</strong></p>
<pre class="crayon-plain-tag">sudo apt-get install subversion
#创建存储库
svnadmin create /var/svn</pre>
<p><strong> 配置subversion服务器：</strong></p>
<pre class="crayon-plain-tag">;vim /var/svn/conf/svnserve.conf
;修改以下内容：
[general]
;关闭匿名访问
anon-access = none
auth-access = write
password-db = passwd


;vim /var/svn/conf/passwd
;添加用户
[users] 
user = passwd</pre>
<p><strong> 启动服务器：</strong></p>
<pre class="crayon-plain-tag">svnserve -d -r /var/svn</pre>
<p><strong> 设置为开机自动启动：</strong></p>
<pre class="crayon-plain-tag">#方法一
cd /etc/init.d/

vi svnserve 
#输入下面一行，并保存
svnserve -d -r /var/svn

#添加执行权限
chmod +x svnserve 

#添加到启动执行的列表中，defaults表示其执行顺序自动，亦可指定数字
update-rc.d svnserve  defaults</pre>
<p>&nbsp;</p>
<pre class="crayon-plain-tag">#方法二
vi /etc/rc.local
#在exit 0前面添加以下内容：
svnserve -d -r /var/svn</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/subversion-server-under-ubuntu">Ubuntu下安装subversion服务器</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/subversion-server-under-ubuntu/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN知识集锦</title>
		<link>https://blog.gmem.cc/svn-faq</link>
		<comments>https://blog.gmem.cc/svn-faq#comments</comments>
		<pubDate>Thu, 23 Jul 2009 01:57:58 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1306</guid>
		<description><![CDATA[<p>常用命令 服务器端命令 创建SVN版本库 命令格式： svnadmin create 路径 --fs-type fsfs&#124;bdb 具体可以参考：Ubuntu下安装subversion服务器  客户端命令 签出：从版本库下载带有svn元数据的副本 命令格式： svn  [co&#124;checkout]  协议://版本库路径　/本地路径   [选项]   [全局选项] 命令详解： 协议 根据版本库的配置不同，可能是svn、http、https等 版本库路径 <a class="read-more" href="https://blog.gmem.cc/svn-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/svn-faq">SVN知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h1"><span class="graybg">常用命令</span></div>
<div class="blog_h2"><span class="graybg">服务器端命令</span></div>
<div class="blog_h3"><span class="graybg">创建SVN版本库</span></div>
<p>命令格式： svnadmin create 路径 --fs-type fsfs|bdb</p>
<p>具体可以参考：<a title="Ubuntu下安装subversion服务器" href="/subversion-server-under-ubuntu" target="_blank">Ubuntu下安装subversion服务器</a> </p>
<div class="blog_h2"><span class="graybg">客户端命令</span></div>
<div class="blog_h3"><span class="graybg">签出：从版本库下载带有svn元数据的副本</span></div>
<p>命令格式：</p>
<p>svn  [co|checkout]  协议://版本库路径　/本地路径   [选项]   [全局选项]</p>
<p>命令详解：</p>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td style="width: 100px;">协议</td>
<td>根据版本库的配置不同，可能是svn、http、https等</td>
</tr>
<tr>
<td>版本库路径</td>
<td>版本库往往会有trunk、tag、branches等分支，注意如果你需要签出demo，可能需要定位到demo/trunk</td>
</tr>
<tr>
<td>本地路径</td>
<td>可以指定相对（于当前目录的）路径或者绝对路径</td>
</tr>
<tr>
<td>选项</td>
<td><strong>-r　</strong>需要签出的版本，可以是版本号，或者：</p>
<p style="padding-left: 60px;">HEAD　最新版本；</p>
<p style="padding-left: 60px;">BASE　当前工作拷贝的版本；</p>
<p style="padding-left: 60px;">COMMITTED　上一次提交的版本；</p>
<p style="padding-left: 60px;">PREV　COMMITTED的前一个版本</p>
<p><strong>-q</strong>　不打印详细的信息 <strong>--depth</strong>　限制操作影响的目录深度：</p>
<p style="padding-left: 60px;">empty　仅指定的目录；</p>
<p style="padding-left: 60px;">files　目录和其子文件，不包括子目录；</p>
<p style="padding-left: 60px;">immediates　目录和其直接子文件、直接子目录；</p>
<p style="padding-left: 60px;">infinity　包括所有后代</p>
<p><strong>--force</strong>　强制执行，正常使用下，SVN可能会阻止某些操作</p>
<p><strong>--ignore-externals</strong>：忽略SVN管理的外部工作拷贝</p>
</td>
</tr>
<tr>
<td>全局选项</td>
<td><strong> --username:</strong> 指定用户名<br /> <strong>--password:</strong> 指定密码<br /> <strong>--no-auth-cache</strong>: 不要缓存用于认证的用户密码<strong>--non-interactive</strong> :不要进行交互式提示</p>
<p><strong>--force-interactive</strong> : 强制交互式提示</p>
<p><strong>--trust-server-cert :</strong> 信任服务端的证书，不做提示</p>
<p><strong>--config-dir:</strong> 从指定的目录读取用户的配置信息</p>
<p><strong>--config-option</strong> :以FILE:SECTION:OPTION=[VALUE]的形式设置选项</p>
</td>
</tr>
</tbody>
</table>
<p>示例：</p>
<pre class="crayon-plain-tag">#签出到当前目录的子目录
svn checkout svn://192.168.1.15/test svntest
#签出，并指定用户密码
svn co svn://192.168.1.15/demo ~/projects/demo --username u --password p
#非交互式导出，信任服务器证书
svn --non-interactive --no-auth-cache --trust-server-cert 
    --username $SVNUSER --password $SVNPSWD 
    export https://192.168.1.15/demo</pre>
<div class="blog_h3"><span class="graybg">更新：从版本库获取更改到工作拷贝</span></div>
<p>命令格式：svn update [路径]  [选项] [全局选项]</p>
<p>对于每一个受影响的文件，都用一个字母来表示对其进行的操作：</p>
<table class="full-width fixed-word-wrap" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td style="width: 20%;">A</td>
<td>新文件，添加到工作拷贝</td>
</tr>
<tr>
<td>D</td>
<td>删除工作拷贝的文件</td>
</tr>
<tr>
<td>U</td>
<td>更新空座拷贝的文件</td>
</tr>
<tr>
<td>C</td>
<td>文件存在冲突，需要处理</td>
</tr>
<tr>
<td>G</td>
<td>文件被自动合并</td>
</tr>
</tbody>
</table>
<p>命令详解：</p>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td style="width: 100px;">路径</td>
<td>需要更新的文件或者目录</td>
</tr>
<tr>
<td>选项</td>
<td><b>-r、--depth、-q、--force、--ignore-externals</b>：参考签出命令<br /> <strong>--set-depth</strong>　设置新的工作拷贝的depth<strong>--diff3-cmd</strong>　使用参数指定的命令进行文件合并<strong>--cl　</strong>仅仅操作参数指定的成员</p>
<p><strong>--editor-cmd</strong>　指定外部编辑器</p>
<p><strong>--accept　</strong>设置自动冲突处理方式：</p>
<p style="padding-left: 60px;">postpone(p)　不做任何处理；</p>
<p style="padding-left: 60px;">edit(e)　打开冲突文件手工处理；</p>
<p style="padding-left: 60px;">launch(l)　打开交互式冲突处理工具；</p>
<p style="padding-left: 60px;">base　使用BASE版本；</p>
<p style="padding-left: 60px;">working　使用工作拷贝版本，假设冲突已经被手工处理；</p>
<p style="padding-left: 60px;">mine-full(mf)　使用本地的修改；</p>
<p style="padding-left: 60px;">theirs-full(tf)　使用更新得到的文件；</p>
<p style="padding-left: 60px;">mine-conflict(mc)　冲突部分使用本地的修改；</p>
<p style="padding-left: 60px;">theirs-conflict(tc)　冲突部分使用更新得到的文件</p>
<p><strong>--parents</strong>　创建不存在的父目录</p>
</td>
</tr>
<tr>
<td>全局选项</td>
<td>参考签出命令</td>
</tr>
</tbody>
</table>
<p>示例：</p>
<pre class="crayon-plain-tag">#更新themes目录到HEAD版本，如果出现冲突，冲突部分替换为我的本地修改
svn update wp-content/themes --accept mc</pre>
<div class="blog_h3"><span class="graybg">提交：将本地修改保存到版本库上</span></div>
<p>命令格式：svn commit [路径] [选项] [全局选项]</p>
<p>命令详解：</p>
<table style="width: 100%;" border="1" cellspacing="0" cellpadding="5">
<tbody>
<tr>
<td style="width: 100px;">路径</td>
<td>需要更新的文件或者目录</td>
</tr>
<tr>
<td>选项</td>
<td><b>-r、--depth、-q、--force、--ignore-externals、--cl、--editor-cmd </b>：参考更新命令<strong>--targets</strong>　将该参数指定的文件的内容，作为额外参数传递</p>
<p><strong>-m　</strong>设置提交的日志消息</p>
<p><strong>-F</strong>　从文件中读取提交日志消息</p>
<p><strong>--encoding</strong>　指定字符集</p>
<p><strong>--with-revprop</strong>　使用name[=value]的形式提供即将提交的修订版的属性</p>
<p><strong>--keep-changelists</strong>　提交后保留changelists</p>
</td>
</tr>
<tr>
<td>全局选项</td>
<td>参考签出命令</td>
</tr>
</tbody>
</table>
<div class="blog_h3"><span class="graybg">其他SVN命令</span></div>
<table class=" full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 15%; text-align: center;">命令</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>svn status</td>
<td>
<p>打印工作拷贝中文件或者目录的状态</p>
<p>命令格式：<pre class="crayon-plain-tag">svn status 路径 [参数]</pre> </p>
</td>
</tr>
<tr>
<td>svn revert</td>
<td>
<p>还原本地修改</p>
<p>命令格式：<pre class="crayon-plain-tag">svn revert 路径</pre> </p>
</td>
</tr>
<tr>
<td>svn propset</td>
<td>
<p>设置目录、文件或者修订版的SVN属性</p>
<p>命令格式： <pre class="crayon-plain-tag">svn propset 属性名 属性值 路径</pre> </p>
<p>举例：</p>
<pre class="crayon-plain-tag"># 将当前目录下的log.txt加入到忽略文件列表
svn propset svn:ignore log.txt .</pre>
</td>
</tr>
<tr>
<td>svn propedit</td>
<td>
<p>使用外部编辑器编辑SVN属性
<p>命令格式：<pre class="crayon-plain-tag"> svn propedit 属性名</pre> </p>
</td>
</tr>
<tr>
<td>svn proplist </td>
<td>显示所有SVN属性</td>
</tr>
<tr>
<td>svn propdel</td>
<td>
<p>删除某个SVN属性</p>
<p>命令格式：<pre class="crayon-plain-tag">svn pd 属性名</pre> </p>
</td>
</tr>
<tr>
<td>svn export</td>
<td>
<p>导出一个未版本化的副本 </p>
<p>命令格式：<pre class="crayon-plain-tag">svn export [-r 修订版]  远程路径  本地路径</pre> </p>
<p>参数：--native-eol 用于指定换行符，可以是：'LF', 'CR', 'CRLF'</p>
</td>
</tr>
<tr>
<td>svn import </td>
<td>
<p>导入本地目录到版本库</p>
<p>命令格式： <pre class="crayon-plain-tag">svn import 本地路径 远程URL</pre> </p>
<p>如果本地路径不指定，则表示当前目录。注意：本地不会生成.svn目录，本地不会和版本库产生关联</p>
</td>
</tr>
<tr>
<td>svn lock</td>
<td>
<p>锁定版本库上的某个路径，避免被别的人修改</p>
<p>命令格式：<pre class="crayon-plain-tag">svn lock 路径</pre> </p>
<p>使用 --force可以窃取锁</p>
</td>
</tr>
<tr>
<td>svn unlock</td>
<td>
<p>解锁某个路径 </p>
<p>命令格式： <pre class="crayon-plain-tag">svn lock 路径</pre> </p>
</td>
</tr>
<tr>
<td>svn add</td>
<td>
<p>使未版本化的文件纳入版本控制，并在下一次commit时提交到版本库 </p>
<p>命令格式：<pre class="crayon-plain-tag">svn add 路径</pre> </p>
<p>--auto-props : 启用自动属性</p>
<p>--no-auto-props : 禁用自动属性 举例：</p>
<pre class="crayon-plain-tag">#将当前目录中所有未版本化的文件纳入版本控制，无限递归，自动在版本库创建缺少的目录
#自动添加属性，安静模式
svn add * --force  --auto-props --parents --depth infinity -q </pre>
</td>
</tr>
<tr>
<td>svn delete</td>
<td>
<p>将指定文件清除出版本控制，并在下一次commit时提交到版本库
<p>命令格式：<pre class="crayon-plain-tag">svn [delete|rm] 路径</pre> </p>
</td>
</tr>
<tr>
<td>svn copy </td>
<td>
<p>在版本库或者工作拷贝复制文件 </p>
<p>命令格式：<pre class="crayon-plain-tag">svn [copy|cp] 源路径  目标路径</pre> </p>
</td>
</tr>
<tr>
<td>svn move </td>
<td>
<p>在版本库或者工作拷贝移动文件</p>
<p>命令格式：<pre class="crayon-plain-tag">svn [move|mv] 源路径  目标路径</pre> </p>
</td>
</tr>
<tr>
<td>svn mkdir</td>
<td>在版本库或者工作拷贝创建目录</p>
<p>命令格式：<pre class="crayon-plain-tag">svn mkdir 路径</pre> </p>
</td>
</tr>
<tr>
<td>svn log </td>
<td>
<p>显示提交日志</p>
<p>命令格式：<pre class="crayon-plain-tag">svn log 路径</pre> </p>
<p>举例：</p>
<pre class="crayon-plain-tag">#显示最近5条提交日志
svn log -l 5 -v
#显示test.c的修订版42的提交日志
svn log test.c@42
#显示test.c上一次更新以后的提交消息
svn log -r BASE:HEAD test.c </pre>
</td>
</tr>
</tbody>
</table>
<div class="blog_h1"><span class="graybg">如何处理冲突</span></div>
<div class="blog_h2"><span class="graybg">基本知识</span></div>
<div>允许svn update时，可能出现冲突。当 冲突发生时，SVN会自动生成额外3个未版本化的文件到工作拷贝对应的目录中： <strong>fileName.mine </strong>当前工作拷贝的最新修改 <strong>fileName.rOLDREV </strong>当前工作拷贝的BASE版本 <strong>fileName.rNEWREV</strong> 刚从服务器更新的版本 这三个文件删除之前，无法提交。 解决冲突的方式有三种：</div>
<div>
<ol>
<li>
<div><span style="color: #000000;">手工合并</span></div>
</li>
<li>使用上面三个临时文件之一覆盖修改</li>
<li>svn revert回退本地修改</li>
</ol>
</div>
<div class="blog_h2"><span class="graybg">如何手工合并修改？</span></div>
<p>冲突文件中，使用<span style="color: #ff0000;"><strong>&lt;&lt;&lt; === &gt;&gt;&gt;</strong></span>这样的符号来对冲突进行标记：
<pre class="crayon-plain-tag">private int name;
/*前两段符号圈定的是本地的修改内容*/
&lt;&lt;&lt;&lt;&lt;&lt;&lt; .mine
private Date dob;
=======
private Date birthDate;
&gt;&gt;&gt;&gt;&gt;&gt;&gt; .r2
/*后两段符号圈定的是从版本库更新下来的内容，最后会附加其版本号*/</pre>
<p>具体的修改需要结合实际工作内容进行。</p>
<div class="blog_h1"><span class="graybg">TortoiseSVN</span></div>
<p>TortoiseSVN是一个图形化的SVN客户端软件，它使用不同的图标来标记文件的状态：</p>
<p><a href="/wp-content/uploads/2009/07/TortoiseSVN.png"><img src="https://blog.gmem.cc/wp-content/uploads/2009/07/TortoiseSVN.png" alt="TortoiseSVN" width="418" height="209" /></a></p>
<div class="blog_h1"><span class="graybg">常见问题</span></div>
<div class="blog_h2"><span class="graybg">常见错误</span></div>
<div class="blog_h3"><span class="graybg">设置svn:ignore无效</span></div>
<div>如果svn:ignore的目标文件已在版本库上已经存在，则设置无效，可以先删除版本库上的目标文件，客户端进行更新后设置</div>
<div class="blog_h3"><span class="graybg">working copy locked</span></div>
<p>运行：svn cleanup</p>
<div class="blog_h3"><span class="graybg">Can't convert string from 'UTF-8' to native encoding</span></div>
<p>Linux下出现此错误，是Locale设置问题，解决办法：</p>
<pre class="crayon-plain-tag">export LC_ALL=en_US.UTF-8</pre>
<div class="blog_h3"><span class="graybg">This line, and those below, will be ignored</span></div>
<p>需要添加提交日志：<pre class="crayon-plain-tag">svn commit -m "日志内容"</pre> </p>
<div class="blog_h3"><span class="graybg">svn: E155010: '***' is scheduled for addition, but is missing</span></div>
<p>运行：<pre class="crayon-plain-tag">svn delete ***</pre> </p>
<div class="blog_h2"><span class="graybg">Howtos</span></div>
<div class="blog_h3"><span class="graybg">全部添加到版本控制</span></div>
<pre class="crayon-plain-tag">svn add --force * --auto-props --parents --depth infinity -q </pre>
<div class="blog_h3"><span class="graybg">本地删除同步SVN删除</span></div>
<pre class="crayon-plain-tag">svn status | grep ^! | awk '{ print " --force " $2"@"}' | xargs svn rm</pre>
<p>之所以在文件名末尾添加@，是因为@是SVN特殊符号，结尾加上@表示将文件名中出现的@作为普通字符看待。 </p>
<div class="blog_h3"><span class="graybg">设置Maven项目的SVN属性</span></div>
<div>
<pre class="crayon-plain-tag">## svn:ignore设置 ##
#根目录上通常要设置：
target
.*
#如果使用JRebel，则src/main/resources上要设置
rebel.xml</pre>
</div>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/svn-faq">SVN知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/svn-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
