Svn 您可以使用Subversion进行部分签出吗?

Svn 您可以使用Subversion进行部分签出吗?,svn,sparse-checkout,Svn,Sparse Checkout,如果我在trunk/下有20个目录,每个目录中有很多文件,并且只需要其中的3个目录,是否可以只使用trunk下的3个目录进行Subversion签出?或者对/trunk进行非递归签出,然后只需手动更新所需的3个目录。没有任何特别有用的方式,不可以。你可以检查子树(如Bobby Jack的建议),但是你失去了原子更新/提交它们的能力;要做到这一点,它们需要放在它们的公共父项下,一旦您签出公共父项,您将下载该父项下的所有内容。非递归不是一个好选项,因为您希望更新和提交是递归的。有点像。正如博比所说:

如果我在trunk/下有20个目录,每个目录中有很多文件,并且只需要其中的3个目录,是否可以只使用trunk下的3个目录进行Subversion签出?

或者对/trunk进行非递归签出,然后只需手动更新所需的3个目录。

没有任何特别有用的方式,不可以。你可以检查子树(如Bobby Jack的建议),但是你失去了原子更新/提交它们的能力;要做到这一点,它们需要放在它们的公共父项下,一旦您签出公共父项,您将下载该父项下的所有内容。非递归不是一个好选项,因为您希望更新和提交是递归的。

有点像。正如博比所说:

svn co file:///.../trunk/foo file:///.../trunk/bar file:///.../trunk/hum
将获得文件夹,但您将从subversion的角度获得单独的文件夹。您必须对每个子文件夹进行单独的提交和更新


我不相信你可以签出一个部分树,然后将该部分树作为一个单独的实体使用。

事实上,多亏了我在这里发表的评论,这看起来是一条可行的道路。我认为应该采取以下措施:

svn checkout --depth empty http://svnserver/trunk/proj
svn update --set-depth infinity proj/foo
svn update --set-depth infinity proj/bar
svn update --set-depth infinity proj/baz
或者,
--depth immediate
而不是
empty
检查
主干/proj
中的文件和目录,而不检查其内容。这样,您可以看到存储库中存在哪些目录


正如@zigdon的回答中提到的,您还可以执行非递归签出。这是实现类似效果的一种较老且不太灵活的方法:

svn checkout --non-recursive http://svnserver/trunk/proj
svn update trunk/foo
svn update trunk/bar
svn update trunk/baz

Subversion 1.5引入了稀疏签出,这可能会对您有用。从:

。。。稀疏目录(或浅签出)。。。允许您更轻松地签出工作副本或工作副本的一部分,而不是完全递归,并且可以在以后自由地引入以前忽略的文件和子目录


我编写了一个脚本来自动化复杂的稀疏签出

#/usr/bin/env python
'''
此脚本对当前工作目录中的SVN树进行稀疏签出。
给定SVN存储库中的路径列表,它将:
1.签出公共根目录
2.对于中间目录,更新深度为空
3.叶目录的更新深度为无穷大
'''
导入操作系统
导入getpass
导入pysvn
__作者(Karl Ostmo)
__日期=“2011年7月13日”
# =============================================================================
#XXX os.path.commonprefix()函数的行为不符合预期!
#请看这里:http://mail.python.org/pipermail/python-dev/2002-December/030947.html
#在这里:http://nedbatchelder.com/blog/201003/whats_the_point_of_ospathcommonprefix.html
#这里(发生过什么事?):http://bugs.python.org/issue400788
从itertools导入takewhile
def allnamesequal(名称):
返回名称[1:]中n的全部(n==名称[0])
def commonprefix(路径,sep='/'):
ByDirectoryLevel=zip(*[p.split(sep)表示路径中的p])
返回sep.join(takewhile中x的x[0](所有名称相等,按目录级别))
# =============================================================================
def getSvnClient(选项):
password=options.svn\u密码
如果不是密码:
password=getpass.getpass('输入用户“%s”的SVN密码:'%options.SVN\u用户名)
client=pysvn.client()
client.callback\u get\u login=lambda realm,username,may\u save:(True,options.svn\u username,password,True)
返回客户端
# =============================================================================
带有反馈的def稀疏更新(客户端、新更新路径):
修订版列表=client.update(新的更新路径,depth=pysvn.depth.empty)
# =============================================================================
def sparse_签出(选项、客户端、repo_url、sparse_路径、本地_签出_根):
路径分割=稀疏路径分割(os.sep)
路径_段。反向()
#更新中间路径段
新建\更新\路径=本地\签出\根
而len(路径_段)>1:
path_segment=path_segments.pop()
new\u update\u path=os.path.join(new\u update\u path,path\u段)
带有反馈的稀疏更新(客户端、新更新路径)
如果options.verbose:
打印“添加的内部节点:”,路径\ U段
#更新叶路径段,完全递归
leaf_segment=路径_segments.pop()
新建更新路径=os.path.join(新建更新路径,叶段)
如果options.verbose:
打印“现在将使用‘递归’:”进行更新,新的更新路径
update\u revision\u list=client.update(新的更新路径)
如果options.verbose:
对于更新版本列表中的版本:
打印”-已完成将%s更新为版本:%d“%(新的更新路径,版本号)
# =============================================================================
def组稀疏签出(选项、客户端、回购url、稀疏路径列表、本地签出根):
如果不是稀疏路径列表:
打印“无事可做!”
返回
签出路径=无
如果len(稀疏路径列表)>1:
签出路径=公共前缀(稀疏路径列表)
其他:
签出路径=稀疏路径列表[0]。拆分(os.sep)[0]
root\u checkout\u url=os.path.join(repo\u url,checkout\u path)。替换(“\\”,“/”)
revision=client.checkout(root\u checkout\u url,local\u checkout\u root,depth=pysvn.depth.empty)
签出路径分段=签出路径分割(os.sep)
对于稀疏路径列表中的稀疏路径:
#删除前导路径段
路径分割=稀疏路径分割(os.sep)
起始段索引=0
对于i,枚举中的段(签出路径段):
如果段==路径_段[i]:
起始段索引+=1
其他:
打破
删减路径=os.sep.join(路径分段[开始分段分段分段分段索引:)
稀疏签出(选项、客户端、回购url、修剪路径、本地签出根)
# ===
svn update --set-depth=exclude www
svn update --set-depth=infinity www