svn如何忽略文件svn:ignore

用过各种版本控制软件,各有优劣,适合于不同的场景使用,但最终还是回来使用svn。简单说一说,mercurial-hg和git都是分布式版本控制软件,既然是分布式的,每个人都有全量版本,所以随时都可以commit,而不需要连网,一个人做开发非常方便。但是如果多人多项目快速迭代,就感觉还是不如svn方便。很多人喜欢跟我争论svn是多么的难用,多么low,这里我就举几方面来说。

1. hg和git确实管理过很多大项目,包含Linux内核源码,但是很多人之所以使用它是因为原来的sourceforge和现在的github是基于它俩的,所以实际上很多人还是拿他们当中心化的版本控制软件来用,而sourceforge和github就是这里的中心节点。

2. hg和git本身很好布署,但是除了版本控制之外,基本都没有提供权限管理,如果需要权限管理就得布署各种三方的东西,结果就变得很麻烦,相当于要搭建一个github网站。然而在多角色多项目开发中,又需要为不同的代码分支授权给不同的角色人员。而svn权限控制这方面却恰到好处,安全性并不算高,但是理解和布署都非常简单,完全满足需求。

3. git是各版本存全量,速度快,但占用空间大,hg是存diff,节省了空间,但是牺牲了速度。而svn本地只存一个版本,拉取代码和占用空间自然都更有优势。

4. 再者,我总感觉将修改提交到服务器,比存自己电脑里要安全得多,操作系统崩溃无法还原也是遇到过的。快节奏的项目迭代,分布式版本管理真感觉没什么用。

本文记录svn的ignore使用,类似于hg的.hgignore和git的.gitignore的作用,不过思路完全不一样。后者是以根路径下的一个隐藏文本文件,来记录哪些文件忽略管理,通常支持通配符和正则匹配。而svn是需要通过命令来修改路径属性的,对,这个属性跟路径绑定,控制该路径下的文件哪些需要忽略管理。属性操作有这么几个命令,意思很容易理解:

propdel   propedit  propget   proplist  propset

有很多属性可修改,而我们这里关注的是svn:ignore和svn:global-ignores。后者是后来版本加的,考虑到如果有些文件在哪都应该忽略,如果每个路径修改属性就有点麻烦了,所以就加了个全局的属性。例如:*.pyc *.pyo这种特别适合。

最基本的编辑某目录的svn:ignore属性,进入编辑器后,就是一行一个文件或目录名,支持通配符:

svn propedit svn:ignore .

有个递归参数,可以获取当前目录和子目录下的svn:ignore属性:

svn propget svn:ignore . --recursive

删除某个目录的svn:ignore属性:

svn propdel svn:ignore media/uploads

自然忽略的文件不会在status命令时罗列,也可以加参数罗列出来,状态为I,就表示为忽略文件:

svn status --no-ignore

因为有全局忽略和本路径忽略多重限定,所以发现某个文件被莫名其妙地忽略,可能需要查一下原因,有参数提供这个功能:

svn propget svn:global-ignores xxx -v --show-inherited-props

对svn:global-ignores的修改也差不多,但是这里有个很奇葩的设计,就是svn本身定义了一批忽略规则,你自己定义的规则却不能覆盖它定义的规则,它定义的规则如果要修改呢,就是修改这个文件:

~/.subversion/config

默认规则为:

# global-ignores = *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo __pycache__
#   *.rej *~ #*# .#* .*.swp .DS_Store [Tt]humbs.db

这就蛋疼了,这个文件是客户端自己系统里的文件,你无法通过服务端来控制,只能每个开发自己改自己的。于是就有人提出这是bug,说:你是native developer(就是写c/c++之类的)自然需要忽略*.a *.so,但我是手机移动开发的,哪个项目不会添加一点三方so依赖的?!其实我想说的是:很多公司都是拿svn当上线工具用的,出问题了直接通过svn来回滚,编译的.so/.a都是统统要管理的!

当然啦,手动去svn add被忽略的文件,也是会强制管理该文件的,查了很久的资料,发现没有好的解决办法,但通常这样的手动强制添加不会太频繁,也就忍了吧。

发表于 2018年11月20日 00:09   评论:0   阅读:3361  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo