我加入了一个新团队,他们选择 tfs 2012 来管理源代码,因为它是从 vss 升级而来的。但据我所知,更多的团队成员喜欢颠覆。
这几口用tfs比较难,我发现'SvnBridge'可以帮助开发者使用svn client来使用tfs。
我已经在 tfs 应用服务器(iis-header:tfssvn.mydomain.com,iis-port 80)上成功配置了 SvnBridge-Server。所以它可以做到这些:
- 资源管理器中的浏览器文件和文件夹,使用http://tfssvn.mydomain.com/
- 浏览 TortoiseSVN 中的一些文件夹和文件,用户 http://tfssvn.mydomain.com/,但是有些文件夹无法列出,可能它有无效字符,如“R&D”等。“R&D”的父文件夹无法列出,所以它下面的所有文件夹和文件都无法列出或读取。(但在原始Subversion Repository中,支持名为“R&D”的目录。我已经测试过。)
- 不能退房。所有文件夹和文件都不能用 TortoiseSVN 或 svn 命令行检出。
我使用的SvnBridge( http://svnbridge.codeplex.com/ ) 最新版本v6.2,半年前发布,2013年9月12日,最新签到2013年10月13日。很多bug在“讨论”中,恐怕项目已经停止了。
我想知道是否有其他一些解决方案,如“SvnBridge”可以支持 svn-client 在 tfs 上使用?
来自 SvnBridge Sever 的错误日志:
Time : 2014/2/18 0:09:59
Message : The remote server returned an error (404) not found.
User : my-domain-name
Request : PROPFIND /!svn/bc/45787/CJG/01_Document HTTP/1.1
<?xml version="1.0" encoding="utf-16"?>
<propfind xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="DAV:">
<prop>
<resourcetype xmlns="DAV:" />
<getcontentlength xmlns="DAV:" />
<deadprop-count xmlns="http://subversion.tigris.org/xmlns/dav/" />
<version-name xmlns="DAV:" />
<creationdate xmlns="DAV:" />
<creator-displayname xmlns="DAV:" />
</prop>
</propfind>
Exception:
System.Net.WebException: The remote server returned an error (404) not found.
at System.Net.HttpWebRequest.GetResponse()
at CodePlex.TfsLibrary.ObjectModel.WebTransferService.DownloadBytes(String url, ICredentials credentials)
at SvnBridge.Infrastructure.FileRepository.GetFile(ItemMetaData item, Guid repositoryUuid)
at SvnBridge.SourceControl.TFSSourceControlProvider.ReadFile(ItemMetaData item)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.TracingInterceptor.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.RetryOnExceptionsInterceptor`1.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.ProxyFactory.RemotingProxy.Invoke(IMessage msg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at SvnBridge.SourceControl.TFSSourceControlProvider.ReadFile(ItemMetaData item)
at SvnBridge.Nodes.FileNode.GetContentLength()
at SvnBridge.Nodes.FileNode.GetProperty(RequestHandlerBase handler, XmlElement property)
at SvnBridge.Nodes.BcFileNode.GetProperty(RequestHandlerBase handler, XmlElement property)
at SvnBridge.Handlers.PropFindHandler.WriteProperties(INode node, List`1 properties, TextWriter output, Boolean isFolder)
at SvnBridge.Handlers.PropFindHandler.WriteBcResponse(TFSSourceControlProvider sourceControlProvider, String requestPath, String depthHeader, PropData data, Stream outputStream)
at SvnBridge.Handlers.PropFindHandler.HandleProp(TFSSourceControlProvider sourceControlProvider, String requestPath, String depthHeader, String labelHeader, PropData data, Stream outputStream)
at SvnBridge.Handlers.PropFindHandler.Handle(IHttpContext context, TFSSourceControlProvider sourceControlProvider)
at SvnBridge.Handlers.RequestHandlerBase.Handle(IHttpContext context, IPathParser pathParser, NetworkCredential credentials)
at SvnBridge.Net.HttpContextDispatcher.Dispatch(IHttpContext connection)
at SvnBridgeServer.SvnBridgeHttpHandler.ProcessRequest(HttpContext context)
Stack Trace:
at System.Net.HttpWebRequest.GetResponse()
at CodePlex.TfsLibrary.ObjectModel.WebTransferService.DownloadBytes(String url, ICredentials credentials)
at SvnBridge.Infrastructure.FileRepository.GetFile(ItemMetaData item, Guid repositoryUuid)
at SvnBridge.SourceControl.TFSSourceControlProvider.ReadFile(ItemMetaData item)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.TracingInterceptor.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.RetryOnExceptionsInterceptor`1.Invoke(IInvocation invocation)
at SvnBridge.Proxies.RemotingInvocation.Proceed()
at SvnBridge.Proxies.ProxyFactory.RemotingProxy.Invoke(IMessage msg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at SvnBridge.SourceControl.TFSSourceControlProvider.ReadFile(ItemMetaData item)
at SvnBridge.Nodes.FileNode.GetContentLength()
at SvnBridge.Nodes.FileNode.GetProperty(RequestHandlerBase handler, XmlElement property)
at SvnBridge.Nodes.BcFileNode.GetProperty(RequestHandlerBase handler, XmlElement property)
at SvnBridge.Handlers.PropFindHandler.WriteProperties(INode node, List`1 properties, TextWriter output, Boolean isFolder)
at SvnBridge.Handlers.PropFindHandler.WriteBcResponse(TFSSourceControlProvider sourceControlProvider, String requestPath, String depthHeader, PropData data, Stream outputStream)
at SvnBridge.Handlers.PropFindHandler.HandleProp(TFSSourceControlProvider sourceControlProvider, String requestPath, String depthHeader, String labelHeader, PropData data, Stream outputStream)
at SvnBridge.Handlers.PropFindHandler.Handle(IHttpContext context, TFSSourceControlProvider sourceControlProvider)
at SvnBridge.Handlers.RequestHandlerBase.Handle(IHttpContext context, IPathParser pathParser, NetworkCredential credentials)
at SvnBridge.Net.HttpContextDispatcher.Dispatch(IHttpContext connection)
at SvnBridgeServer.SvnBridgeHttpHandler.ProcessRequest(HttpContext context)
Headers:
Transfer-Encoding: chunked
Content-Type: text/xml
Accept-Encoding: gzip
Authorization: Basic d2FuZG9uZVxyeWFuemh1OjEyMzQ1Ng==
Host: wddevsvr01
User-Agent: SVN/1.8.5 (x64-microsoft-windows) serf/1.3.2 TortoiseSVN-1.8.4.24972
DAV: http://subversion.tigris.org/xmlns/dav/svn/depth
DAV: http://subversion.tigris.org/xmlns/dav/svn/mergeinfo
DAV: http://subversion.tigris.org/xmlns/dav/svn/log-revprops
Depth: 1