15. 我不能象 CVS 那样使用标签将一个分支的变更合并到主干(trunk),可以吗?
就像下面展示的,你可以不需要记住版本号就将一个分支合并到主线上面。反之亦然(在例子中并没有展示)。
下面这个例子假设在/home/repos 存在一个版本库,你希望从中创建一个名叫 bar 的、包含你即将编辑的文件
foo 的分支。
为了跟踪分支合并的历史,版本库建立了 tags/branch_traces/目录用来保存 tags。 # setup branch
and tags
$ svn copy file:///home/repos/trunk
file:///home/repos/branches/bar_branch
-m "start of bar branch"
$ svn copy file:///home/repos/branches/bar_branch
file:///home/repos/tags/branch_traces/bar_last_merge
-m "start"
# checkout branch working copy
$ svn checkout file:///home/repos/branches/bar_branch wc
$ cd wc
# edit foo.txt file and commit
$ echo "some text" >>foo.txt
$ svn commit -m "edited foo"
# switch to trunk and merge changes from branch
$ svn switch file:///home/repos/trunk
$ svn merge file:///home/repos/tags/branch_traces/bar_last_merge
file:///home/repos/branches/bar_branch
# Now check the file content of 'foo.txt', it should contain the changes.
# commit the merge
$ svn commit -m "Merge change X from bar_branch."
# finally, update the trace branch to reflect the new state of things
$ svn delete -m "Remove old trace branch in preparation for refresh."
file:///home/repos/tags/branch_traces/bar_last_merge
$ svn copy file:///home/repos/branches/bar_branch
file:///home/repos/tags/branch_traces/bar_last_merge
-m "Reflect merge of change X."
为什么$Revision$关键字不是我预想的那样?它替换的是文件最后修改的修订版
本,但有时候我希望它能替换文件的当前修订版本。
Subversion 每次都将整个版本库的版本号整个进行自增,所以它不能将关键词替换成你想要的数字 - 它可能不
得不在每次更新或者提交时对工作拷贝中的每个文件进行搜索或者修改。
你想要的信息(你的工作拷贝的版本号)可以通过 svnversion 命令来获取;你可以根据指定的工作拷贝的路径提
供其版本相关的信息(更多细节参考 svnversion --help)。
你可以将其组合到你的构建或发布过程中,以获取需要存放到源代码的信息。例如,在一个基于 GNU make 的构
建环境中,在你的 Makefile 中添加如下的信息: ##
16. ## To use this, in yourfile.c do something like this:
## printf("this program was compiled from SVN revision %sn",SVN_REV);
##
SVNDEF := -D'SVN_REV="$(shell svnversion -n .)"'
CFLAGS := $(SVNDEF) ... continue with your other flags ...
(注意这段代码在非 GNU 版本的 make 中无效,如果你的构建过程需要可移植,请不要使用它。)
或者使用如这些方法: ##
## on every build, record the working copy revision string
##
svn_version.c: FORCE
echo -n 'const char* svn_version(void) { const char* SVN_Version = "'
> svn_version.c
svnversion -n . >> svn_version.c
echo '"; return SVN_Version; }' >> svn_version.c
##
## Then any executable that links in svn_version.o will be able
## to call the function svn_version() to get a string that
## describes exactly what revision was built.
##
Windows 用户会希望使用 SubWCRev.exe,TortoiseSVN 的下载页面就有;可以用当前工作拷贝的修订版本
替换给定文件中的所有$WCREV$标签。
Subversion 是否有一个功能类似 CVS 的$Log$的关键字呢?
没有。在 CVS 中没有对应的$Log$关键字,如果你希望将日志信息输入某个特定文件,你可以使用'svn log
your-file-name'或'svn log url-to-your-file'。邮件列表中有几个解释$Log$缺点的例子: “当你开
始合并分支之间的变更时,$Log$会是一个完全的梦魇。你一定会在这里得到冲突 -- 因为关键字的本性 -- 很
难简单的自动解决冲突。”
而且: Subversion 的日志信息是可以改变的,可以通过设置 svn:log 修订版本属性修改。所以在任意文件扩
展$Log:$会造成数据的过时,更新操作可能需要访问所有出现$Log:$关键字的文件,即使这些文件没有其他的
变更。
我对此并不在意,我还是期望使用它,你能实现吗?
不能,我们自己没有计划实现它,也不会接受实现这个特性的补丁。如果你希望发布包含某种变更日志的文件,
你可以在你的构建系统中跳出这个限制。
在我的工程里有一个文件,每个人都必须改变它,但是我不希望他们本地的修改被提
交,如何让'svn commit'忽略这个文件?
答案是:不要将文件纳入版本控制,而是将文件的模板纳入版本控制,例如“file.tmpl”。
然后,在初始化的‘svn checkout’之后,让你的用户(或你的构建系统)执行通过普通的操作系统复制将文件修
改为正确的文件名,文件未版本化,所以绝不会提交。并且如果你 希望,你可以将文件加入到父目录的
svn:ignore 属性中,这样它就不会在‘svn status’命令中显示‘?’。