很多站长朋友们都不太清楚svn目录结构php,今天小编就来给大家整理svn目录结构php,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 svn 详解 2、 SVN的操作说明以及备份策略 3、 如何设置SVN的目录结构,现在网上都只列到二级目录,更细的应该如何划分 4、 SVN结构目录怎么分 5、 怎样创建SVN仓库目录结构 6、 Svn有没有命令可以导出一个项目的所有目录结构 svn 详解1、检出
svncohttp://路径(目录或文件的全路径)[本地目录全路径]
--username 用户名 --password 密码svncosvn://路径(目录或文件的全路径)[本地目录全路径]--username 用户名 --password 密码
svncheckouthttp://路径(目录或文件的全路径)[本地目录全路径] --username用户名
svncheckoutsvn://路径(目录或文件的全路径)[本地目录全路径]--username用户名
注:如果不带--password 参数传输密码的话,会提示输入密码,建议不要用明文的--password 选项。
其中 username 与 password前是两个短线,不是一个。
不指定本地目录全路径,则检出到当前目录下。
例子:
svn co svn://localhost/测试工具/home/testtools--usernamewzhnsc
svn co
svn checkout svn://localhost/测试工具/home/testtools--usernamewzhnsc
svncheckout
2 、 导出(导出一个干净的不带.svn文件夹的目录树 )
svnexport[-r 版本号]http://路径(目录或文件的全路径) [本地目录全路径]--username用户名
svnexport[-r 版本号]svn://路径(目录或文件的全路径) [本地目录全路径]--username用户名
svnexport本地检出的(即带有.svn文件夹的)目录全路径要导出的本地目录全路径
注:第一种从版本库导出干净工作目录树的形式是指定URL,
如果指定了修订版本号,会导出相应的版本,
如果没有指定修订版本,则会导出最新的,导出到指定位置。
如果省略本地目录全路径,URL的最后一部分会作为本地目录的名字。
第二种形式是指定 本地检出的目录全路径 到 要导出的本地目录全路径,所有的本地修改将会保留,
但是不在版本控制下(即没提交的新文件,因为.svn文件夹里没有与之相关的信息记录)的文件不会拷贝。
例子:
svn export svn://localhost/测试工具/home/testtools--usernamewzhnsc
svn export svn://localhost/test/testapp--usernamewzhnsc
svn export /home/testapp/home/testtools
3、添加新文件
svnadd文件名
注:告诉SVN服务器要添加文件了,还要用svn commint -m真实的上传上去!
例子:
svn addtest.php<-添加test.php
svn commit -m“添加我的测试用test.php“ test.php
svn add*.php<-添加当前目录下所有的php文件
svn commit -m“添加我的测试用全部php文件“ *.php
4、提交
svncommit-m“提交备注信息文本“[-N][--no-unlock]文件名
svnci-m“提交备注信息文本“[-N][--no-unlock]文件名
必须带上-m参数,参数可以为空,但是必须写上-m
例子:
svn commit -m“提交当前目录下的全部在版本控制下的文件“ *<-注意这个*表示全部文件
svn commit -m“提交我的测试用test.php“ test.php
svn commit -m“提交我的测试用test.php“-N --no-unlocktest.php<-保持锁就用–no-unlock开关
svn ci -m“提交当前目录下的全部在版本控制下的文件“ *<-注意这个*表示全部文件
svn ci -m“提交我的测试用test.php“ test.php
svn ci -m“提交我的测试用test.php“-N --no-unlocktest.php<-保持锁就用–no-unlock开关
5、更新文件
svnupdate
svnupdate-r修正版本文件名
svnupdate文件名
例子:
svn update<- 后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本
svn update -r200 test.cpp<-将版本库中的文件 test.cpp 还原到修正版本(revision)200
svn updatetest.php<-更新与版本库同步。
提交的时候提示过期冲突,需要先 update 修改文件,
然后清除svn resolved,最后再提交commit。
6、删除文件
svndeletesvn://路径(目录或文件的全路径) -m “删除备注信息文本”
推荐如下操作:
svndelete文件名
svnci-m“删除备注信息文本”
例子:
svn delete svn://localhost/testapp/test.php-m“删除测试文件test.php”
推荐如下操作:
svn deletetest.php
svn ci -m“删除测试文件test.php”
7、加锁/解锁
svnlock-m“加锁备注信息文本“[--force]文件名
svnunlock文件名
例子:
svn lock -m“锁信测试用test.php文件“ test.php
svn unlocktest.php
8、比较差异
svndiff文件名
svndiff-r修正版本号m:修正版本号n文件名
例子:
svn difftest.php<-将修改的文件与基础版本比较
svn diff -r200:201 test.php<-对 修正版本号200 和 修正版本号201 比较差异
9、查看文件或者目录状态
svn st目录路径/名
svn status 目录路径/名<-目录下的文件和子目录的状态,正常状态不显示
【?:不在svn的控制中;M:内容被修改;C:发生冲突;
A:预定加入到版本库;K:被锁定】
svn-v 目录路径/名
svn status -v 目录路径/名<-显示文件和子目录状态
【第一列保持相同,第二列显示工作版本号,
第三和第四列显示最后一次修改的版本号和修改人】
注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,
原因是svn在本地的.svn中保留了本地版本的原始拷贝。
10、查看日志
svnlog文件名
例子:
svn logtest.php<-显示这个文件的所有修改记录,及其版本号的变化
11、查看文件详细信息
svninfo文件名
例子:
svn infotest.php
12、SVN 帮助
svnhelp<-全部功能选项
svnhelpci<- 具体功能的说明
13、查看版本库下的文件和目录列表
svnlistsvn://路径(目录或文件的全路径)
svnlssvn://路径(目录或文件的全路径)
例子:
svn list svn://localhost/test
svn ls svn://localhost/test<-显示svn://localhost/test目录下的所有属于版本库的文件和目录
14、创建纳入版本控制下的新目录
svnmkdir目录名
svnmkdir-m"新增目录备注文本"http://目录全路径
例子:
svn mkdirnewdir
svn mkdir -m"Making a new dir."svn://localhost/test/newdir
注:添加完子目录后,一定要回到根目录更新一下,不然在该目录下提交文件会提示“提交失败”
svn update
注:如果手工在checkout出来的目录里创建了一个新文件夹newsubdir,
再用svn mkdirnewsubdir命令后,SVN会提示:
svn: 尝试用 “svn add”或 “svn add --non-recursive”代替?
svn: 无法创建目录“hello”: 文件已经存在
此时,用如下命令解决:
svn add --non-recursivenewsubdir
在进入这个newsubdir文件夹,用ls -a查看它下面的全部目录与文件,会发现多了:.svn目录
再用 svn mkdir -m "添hello功能模块文件" svn://localhost/test/newdir/newsubdir 命令,
SVN提示:
svn: File already exists: filesystem '/data/svnroot/test/db', transaction '4541-1',
path '/newdir/newsubdir '
15、恢复本地修改
svnrevert[--recursive]文件名
注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录。
例子:
svn revertfoo.c<-丢弃对一个文件的修改
svn revert --recursive.<-恢复一整个目录的文件,. 为当前目录
16、把工作拷贝更新到别的URL
svnswitchhttp://目录全路径本地目录全路径
例子:
svn switch .<- (原为123的分支)当前所在目录分支到localhost/test/456
17、解决冲突
svnresolved[本地目录全路径]
例子:
$ svn update
C foo.c
Updated to revision 31.
如果你在更新时得到冲突,你的工作拷贝会产生三个新的文件:
$ ls
foo.c
foo.c.mine
foo.c.r30
foo.c.r31
当你解决了foo.c的冲突,并且准备提交,运行svn resolved让你的工作拷贝知道你已经完成了所有事情。
你可以仅仅删除冲突的文件并且提交,但是svn resolved除了删除冲突文件,还修正了一些记录在工作拷贝管理区域的记录数据,所以我们推荐你使用这个命令。
18、不checkout而查看输出特定文件或URL的内容
svncathttp://文件全路径
例子:
svn cat
19、新建一个分支copy
svn copybranchA branchB-m "make B branch" // 从branchA拷贝出一个新分支branchB
20、合并内容到分支merge
svn mergebranchA branchB// 把对branchA的修改合并到分支branchB
SVN的操作说明以及备份策略2.1 文件检出
安装TortoiseSVN后,SVN会跟Windows的资源管理器完美集成。点击右键,我们可以在菜单栏中选择“SVN检出”选项,输入要检出代码的文件库的URL地址,我们就可以检出该URL地址下的文件库的文件。默认情况下是检出最新版本的代码,如果需要,我们可以通过浏览日志,根据日志来找出想要的版本,然后在“版本”选项中指定相应版本就可以检出相关代码了 。
之后,对于同一个项目的主干开发,我们都在这个检出的代码文件目录下操作,而不是每一次提交或更新都重新检出一次。
2.2 文件添加
我们在本地创建的文件(包括目录)不会受SVN的控制,为了让其接受SVN的控制必须将其添加到文件库中。对于团队其他成员需要的文件,如代码文件、某些模块的.a文件(由于某些需要,该模块代码不公开),我们必须让它们接受SVN的控制,并且保持最新的版本。
2.3 文件删除
当我们需要删除无用的文件(包括目录)时,不能使用Windows的资源管理工具,而必须使用SVN本身的删除文件功能。这样该文件被删除后,其所有修改历史仍然保存在SVN服务器中,以后仍然可以获得该文件的修改历史。
2.4 文件改名
当我们需要对文件(包括目录)进行改名的时,不能使用Windows的资源管理工具,而必须使用SVN本身的文件改名功能。这样该文件被改名后,其改名前的所有修改历史仍然保存在SVN服务器中,保持连续的修改信息。
2.5 文件更新
其他团队成员提交到SVN上的改动不会自动更新到你的本地拷贝中来,我们需要通过更新文件操作来获取其他成员对项目文件所做的修改。SVN更新文件操作会把文件库里的文件与本地文件进行合并,从而达到了同时保留其他成员的修改及本地的修改的目的。如果无法自动合并则会发生冲突,需要使用文件比较工具进行手工合并,合并完成后才能提交已解决冲突的文件。冲突的详细解决方法见第三章——冲突解决。
在团队开发时,更新是一件很重要的工作,可以保持团队成员之间的工作内容一致,因此要注意经常更新自己的工作拷贝,以保证自己能够获得最新的修改内容。
2.6 改动提交
我们对文件(包括目录)所做的一切改动,包括添加、删除、修改文件都必须提交到SVN服务器文件库中才能正式生效,之后团队的其他成员才可以获取你所作的修改。
提交是很重要的一项操作,要求做到:
提交代码之前一定要保证修改后的代码能编译通过,不能提交编译不通过的代码。
比较修改前及修改后的代码,把调试信息或其他不相关的信息去掉,再次确保提交的代码是正确的并且提交的是需要提交的文件。
不要等到修改了很多代码才提交,而是相关小功能完成时就应该提交一次。这样以后发现问题时就很容易撤销有问题的代码——因为撤销只能针对一次提交,所以在一次提交里涉及过多的功能是不推荐的。
提交时必须填写log信息,说明这次提交增加了什么功能或者修正了什么bug。这些信息有助于自己和其他团队成员了解整个项目的历史。当出现问题时也方便定位到对应的版本代码,所以log信息必须足够详细。
事务性提交。也就是说提交要么成功,要么全部失败——即提交出现错误时会自动回滚,实际上没有提交任何东西。出现错误时,解决错误,再次提交上次提交的全部内容即可。
3. 冲突解决
冲突的解决是我们使用SVN过程中的一个棘手问题,所以独立一节来谈论。
3.1 冲突的产生
冲突发生在多个成员同时对同一个文件进行修改的情形下。即当有其他成员已经提交了修改,而自己在本地拷贝中也对该文件进行了修改,而且修改的是同一个地方,那么在进行本地文件的更新时,SVN会不知道该选择那个修改(SVN上的修改还是本地的修改)来进行合并,所以冲突就产生了。
举例说,假如受SVN控制的文件Day.txt在SVN服务器上的当前内容如下:
图表 3 Day.txt文件在本地的修改
我们可以看到,在文本的第一行,SVN上及本地都做了修改。这样当在本地进行更新(提交之前必须先更新),SVN合并时就不知道monday后面到底该是work还是sleep,所以冲突就产生了。
而第三、五行是各自进行了修改,并没有冲突,所以这两行可以顺利合并,合并后可以看到所有人所做的修改。
3.2 冲突的解决
冲突发生后,SVN会在本地保存该文件的不同修改版本,见下图蓝色图标:
图表 4 Day.txt文件的不同版本
Day.txt.r35是版本35的Day.txt文件(本地拷贝最新版本)
Day.txt.r37是版本37的Day.txt文件(SVN上最新版本)
Day.txt.mine的是本地修改后的Day.txt文件
Day.txt文件中包含了合并后的内容
3.2.1 简单冲突解决
对于简单的内容冲突,我们可以直接在合并后的文件上修改。在上例中,我们打开Day.txt文件,可以看到SVN合并后的内容:
图表 5 Day.txt合并后内容
我们看到没有冲突的修改:(play basketball)及(meeting)顺利地合并了,而冲突的部分出现了一些标记。其中标记
<<<<<<< .mine
=======
之间包含的是本地修改的冲突部分的内容,即monday(work)。而标记
=======
>>>>>>> .r37
之间包含的是版本37(SVN上最新版本)该部分内容,即monday(sleep)。
不失一般性,假如我们现在要保留的内容是monday(work),那么我们只要把标记及monday(sleep)部分内容去掉即可:
图表 6 Day.txt解决冲突后内容
确保修改正确后,把Day.txt文件设置为“已解决的”。
图表 7 Day.txt标记为已解决
之后,后缀为mine,r35,r37文件全部消失,仅保留已解决冲突的Day.txt文件,提交到SVN即可。
3.2.2 复杂冲突解决
对于文件内容复杂的文件,上述的解决方法容易漏掉一些要修改的部分,解决起来也耗时耗力。这时要通过SVN提供的工具来解决。
选择SVN功能“编辑冲突”,打开冲突编辑工具:
图表 8 冲突编辑工具
上半部分的两个内容栏分别显示的是版本37的内容及本地修改的内容。
下半部分的内容栏显示的是合并后的内容。
每个内容栏左边的标记清楚地标识了该文件做了那些修改。
文件冲突的部分用红色显眼地表示了出来。在合并栏,点击冲突部分,点击右键,我们可以选择用哪个内容(SVN上最新内容或者本地修改内容)来解决冲突部分,也可以选择两个内容都使用,同时选择它们出现的先后顺序。
逐一解决各个冲突。确保所有冲突都解决后,保存文件,并标记为“已解决”的,退出该工具即完成冲突的解决。
4. 加锁策略
事实上,解决冲突还有一种方法,那就是“严格加锁”。
“严格加锁”要求在编辑文件之前必须先对文件加锁,然后才能进行编辑。此时团队其他成员不能对该文件进行编辑,即保证了同一时刻只有一个人在编辑该文件,因此避免了冲突的出现。
那么,什么类型的文件我们应该采取“严格加锁”呢?
Excel、图片等不可合并的文件,我们必须对其“严格加锁”。“严格加锁”的文件都标记为“可读”的,即不可编辑。要编辑这些“严格加锁”的文件,必须先对其加锁,加锁后文件更改为“可读可写”。编辑完这类文件后要第一时间提交。提交完成时,SVN会自动解开任何你拥有的锁 。
文本文件,比如程序代码,SVN通常可以为我们合并改动,无须“严格加锁”。对于一些大家都频繁改动的重要源代码文件,可能会引起大量冲突,我们也不推荐“严格加锁”,因为加锁会导致大家持续得走来走去去询问加锁情况。正确做法是把文件分成数个逻辑单元,大家都修改各自的单元,减少合并时的冲突。
5. 标签分支
一个项目最初存放的目录我们称之为主干(trunk)。下面我们讨论除了主干之外其他存放项目的目录——标签(tag)和分支(branch)。
5.1 标签(tag)
版本号可以区分多次的代码修改,我们可以使用版本号来检出需要的代码,但对于重要版本的代码,如第三版发布代码,我们不希望记住r37这样的数字。这时,我们就可以通过创建标签来对SVN中这个发布版本的文件的这个时刻的状态创建一个“快照”,以后就可以通过这个标签名字来检出第三发布版本的代码。
标签其实是当前项目文件的简单拷贝,保存在标签所在的目录下。创建标签也是挺简单的,不过要注意:
标签的名字一定要有描述性,可以仅凭名字就知道为什么要创建标签。
不能过多地使用标签,只有在重要时刻或者发布版本时才可以创建标签。
标签是项目文件在某个时刻的状态,不能对其进行修改 。
5.2 分支(branch)
分支跟标签一样,也是当前项目文件的简单拷贝,保存在分支所在的目录下。
分支跟标签的根本区别在于,标签不能对其进行修改,而分支就是为了某种目的的修改而建立的。在检出代码时检出指定分支即可,分支的操作跟主干上的操作完全相同。
5.2.1 何时创建
遇到下述情况,我们可以通过创建分支来解决问题:
发布分支
当我们快要发布一个版本了,一个开发小团队要为这次发布做好准备,比如说修改一些收尾的bug。这时他们需要的是项目的稳定性,而同时我们还有其他团队要开发预计下次发布才会添加进去的功能,显然他们不能在同一份代码上工作,因此我们需要从主干中建立出一个发布分支,发布团队都从这个发布分支检出及提交代码。当程序被发布之后,这个分支依然是活动的。这样,如果客户报告了一些bug,团队会在这个发布分支中修正它们并视情况合并到主干中去。
试验分支
当我们需要对项目做大范围的改动,并且这改动对系统的其余部分有深远的影响,而我们又不能保证这次改动一定能成功的时候就可以建立试验分支。如果试验失败了,可以废弃这个分支;成功了我们只要把分支的改动合并到主干代码中去就可以了。
其他情况,我们不建议创建分支,更不推荐在分支上创建分支,因为分支过多,合并时的冲突将会是一种难于解决的灾难。
5.2.2 合并分支
我们在分支上所修正的bug很可能在主干上或者其他分支上也存在,因为它们往往来自同一份代码,所以我们在分支上所做的改动有必要合并到主干或者其他分支中去。
对于简单的bug,一次提交就能解决问题的,那么我们只要记住提交新版本号,然后使用新版本号把改动合并到其他的受影响的主干及分支中去就可以了。
对于复杂的bug,可能需要多个开发者花几天的时间提交多次才能修好。这时光用版本号来记住修改的内容就有点勉为其难了。因此,我们可以使用标签来标记我们修正过程的开始和结束,然后使用这些标签帮助我们把修正的代码合并到主干和其他分支中去。整个过程如下:
① 给分支打个标签,标记bug修改开始。
② 测试重现bug,修正代码让新测试通过。
③ 提交你的改动到SVN上。
④ 重复步骤2、3,直到确定bug已经修正。
⑤ 再给分支打个标签,标记bug修正结束。
⑥ 使用两个标签来把修正的代码合并到所有其他受影响的主干和分支上。
6. 注意事项
经常更新
由于文件可能有多个人修改,应该经常更新你的工作拷贝中的文件,这样能降低发生冲突的可能性。
测试提交
提交前先在本地进行测试。不允许将有错误的文件提交到SVN服务器上。
填写备注
提交时一定要写备注:备注有助于其他人(包括三个月后的你自己)理解你对文件所做的修改。
整体提交
提交文件时注意要提交一项改动所对应的所有文件,不要一次提交一个文件或者一次提交修改了很多功能的一堆文件。
发布标签
对于每一个发布的版本都要建立标签:当用户告诉你发生某个问题时,你可以迅速地追踪到问题是在哪个版本引入的 。
附:测试自动化小组SVN使用指导原则
1. Project的构建
Project在SVN服务器上的目录架构如下:
SVN上的项目文件:
1. 必须保证Trunk上的代码是最新的!定期对Trunk上的代码进行更新,各小组可根据各自实际情况自己把握
2. Tag是根据项目需要所打的标签,每一个发布的版本都要打Tag,主要是方便有需要时可以直接根据Tag返回到之前的状态,以便于分析、测试;Tag中必须包含相应的release文件及当时编译或发布时的源代码,必须有相关的文档注明项目背景、发布情况等。
3. Branch文件夹可以用作备份用,可以用个人名字命名文件夹;此外,Branch分支主要用来进行短暂或者探索性的开发使用,最终的软件版本必须更新、合并到Trunk主干上。
4. 关于同一项目组开发环境的建议:同一项目组成员的开发环境最好一致,软件安装路径和Project文件存放路径最好一致。
2. 版本号
关于版本号命名规则:主版本号.子版本号.修正版本号
1. 项目初版本时,版本号为0.1.0;
2. 当项目在进行了局部修改或 bug 修正时,主版本号和子版本号都不变,修正版本号加 1;
3. 当项目在原有的基础上增加了部分功能时,主版本号不变,子版本号加 1,修正版本号复位为 0;
4. 当项目在进行了重大修改或局部修正累积较多,而导致项目整体发生全局变化时,主版本号加 1,子版本号和修正版本号复位为0;
5. 编译版本号一般是编译器在编译过程中自动生成的,我们只定义其格式,如果编译器不能自动生成,人手添加,数值代表为当前的系统时间。
例子:V1.0.1 Build090305 Rel111123
其它版本使用规则:
1. α(alphal)内部测试版
此版本表示该软件仅仅是一个初步完成品,只在组内内部交流,该版本软件的 bug 较多,限内部测试使用。
例子:V0.1.1 Build090305 alphal1
2. β(beta)外部测试版
该版本相对于α版已有了很大的改进,经过组内的测试,消除了严重的错误,但还是存在着一些缺陷,需要经过大规模测试来进一步消除。
例子:V0.1.2 Build090305 beta1
3. demo 演示版
仅限评审或讲解时做介绍使用。
例子:V0.1.3 Build090305 demo1
4. release 最终版
该版本意味“最终释放版”,在出了一系列的测试版之后,终归会有一个正式版本,一般情况下,release不会以单词形式出现在软件封面上,取而代之的是符号 (Rel) 。release版本发布时,必须将待发布的软件和相应版本更新记录打包在一起发出。
例子:V1.0.1 Build090305 Rel111123
3. 权限限制
如果项目本身需要对项目组成员作不同的权限控制,可以考虑维护两个工程:一个工程里面有相应的源文件,一个则只有编译后的文件。
4. 模块的版本维护
1. 文件一般不需要版本,但要有详细的更新历史记录;
2. 模块可以以版本来维护,具体可以不同的文件夹区分。
如何设置SVN的目录结构,现在网上都只列到二级目录,更细的应该如何划分在trunk、branches、tags目录下面,再划分目录的话,主要都是看你的应用需要了。
我一般在trunk目录下先分成“文档”、“代码”两个文件夹,文档文件夹下面按文档类型或者阶段进行划分,代码文件夹下面就是代码本身的存储目录了,比如bin,include,lib,data什么的。
一般在branches目录下面在建库的时候不用去划分,每次拉分支出来的时候就自动那下面建文件夹。
tags和branches一样处理,每次发布版本的时候直接建立文件夹。
SVN结构目录怎么分trunk: 开发主干线目录 主要存放源代码目录
tags: 基线目录
test release: 版本测试目录
product release: 产品发布目录(基线)
branches: 分支目录,主要存放一些新开发的功能。
基线就是稳定的程序,里程碑就一个点,比如:我现在是1.0版本的,然后下一次就是1.5版本的
怎样创建SVN仓库目录结构首先在服务器端创建一个SVN库,这时是只有一个顶级文件夹的空仓库,然后:
1、从客户端checkout这个空的SVN库;
2、在客户端checkout出来的这个空文件夹中,按自己的需要新建各级子文件夹,以形成所需的目录结构;
3、对checkout出来的这个文件夹执行add操作,将新建的各级子文件夹纳入SVN控制;
4、对checkout出来的这个文件夹执行commit操作,将刚add进来的各文件夹提交到SVN服务器端。
基本操作就如上所述了,顺便说一下SVN官方推荐的文件夹结构:
根目录下分成trunk、branches、tags三个子文件夹,其中trunk用于存放开发主干,branches用于存放各种分支,tags用于存放各种标记。
Svn有没有命令可以导出一个项目的所有目录结构如果你安装了命令行,可以在cmd中使用:
svn list -R "System_HR/doc/基线管理/开发/薪酬管理/" >aaa.txt
将"System_HR/doc/基线管理/开发/薪酬管理/"目录结构导出到aaa.txt文档中。双引号内填全路径。。
关于svn目录结构php的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于svn目录结构php svn目录结构导出的详细内容...