Visual Studio、TFS 和文件系统链接

Visual Studio, TFS and file system links

我的 Visual Studio 项目位于 C:\Users\MyName\ProjectName.

为了让生活更轻松(我认为),我在名为 TFS 的根目录中创建了一个文件系统 link。
(即 C:\TFS 指向 C:\Users\MyName\Projects

我总是从 link(即 C:\Tfs\ProjectName\ProjectName.sln)打开我的项目,我的 TFS 本地路径使用 link.

这在大多数情况下工作正常,但有些Visual Studio 和 TFS 认为文件在 C:\Users\MyName... 即,如果我查看解决方案中项目的属性,一个可以在 C:\Tfs 中,另一个在 C:\Users 中。我已验证任何解决方案或项目文件中都没有绝对路径。

发生这种情况并且我向项目添加新文件时,TFS 变得一团糟。 TFS 认为新文件位于 C:\Users 中,不受版本控制,但同时 C:\TFS 文件夹中有一个同名文件,因此我需要解决冲突。我可以解决冲突,但 TFS 开始对 C:\Users 文件进行版本控制。即项目的本地文件夹是 C:\TFS... 但根据 TFS(和未决更改),新文件位于 C:\Users 中。

我还没有找到更改文件本地名称的方法,只能更改文件夹。

有没有办法解决这个问题,还是我应该去掉 link?
(它在 TFS 本地工作区中工作得稍微好一些,但问题仍然存在)

Symlinks 很有趣,因为 TFVC 将绑定信息存储在源代码管理文件夹之外,当您的存储库存储在其中或包含它们时,它可能会变得非常混乱。

详情

与 Git、Mercurial 和 Subversion 相反,TFVC 不只是将磁盘与存储库的绑定保存在存储库的子文件夹中(在服务器工作区的情况下,它不会保留此数据)带有存储库的磁盘)。它还将其存储在许多其他地方,即 TFS 服务器和您的用户配置文件。

当您查看 subversion 或 git 存储库时,您会发现 .svn.git 文件夹,其中包含磁盘上哪些文件夹映射到存储库的信息。

对于 TFVC,此信息不仅存储在磁盘上(在本地工作区的情况下),而且还存储在服务器上(机器名称、服务器路径、本地路径)和您的用户配置文件中(在 AppData\Local\Microsoft\TeamFoundation\ 下) ).这些配置存储完整路径,用于查看文件是否受版本控制。本地工作区之所以有所改进,是因为它们添加了包含一些绑定信息的 tf$ 文件夹。

由于工作区映射只能将存储库中的一个文件夹映射到磁盘上的一个文件夹,因此使用 symlinks 会使 TFVC 客户端感到困惑。您可能认为这是一个错误,因为 Microsoft 应该能够解析 link(取决于 link 类型),但 Visual Studio 假设您没有使用 link。这(可能)混淆 Visual Studio 的其他原因是,在使用 link 的情况下,文件大小和其他属性更改并不总是发出信号(日期更改和文件大小可能直到 Visual Studio 被告知刷新解决方案)。只读位(TFVC 在服务器工作区的情况下使用)在使用 links 的情况下也有特殊行为,可能会导致未检测到的签出问题。

更多关于 the strange edge cases caused by links, can be found here

我不确定你为什么要在这种情况下使用 link,源已经存储在 TFS 中,所以你的配置文件的备份不会增加太多,只会让你如果您有漫游配置文件,系统速度会变慢。另外,工作区是机器绑定的,无论如何都不应该 "move between machines" 神奇地。

如果您希望更改此行为,可以在 Visual Studio User Voice, or file a bug on Connect 上提交建议,但要解决您的问题,请使用普通文件夹并将文件映射到唯一位置。

请记住,Windows 中很少有应用程序是为处理 Symlinks 而构建的,那些可能会导致奇怪的行为。 Windows 资源管理器(文件打开对话框和拖放)可能会提供原始文件位置,而不是某些操作的 link 位置,并且一个位置的属性更改可能在 link 中不可见编辑位置。

正如你在这里看到的,系统将能够看到 symlinks 和真实目录之间的区别,因此可以根据这些知识采取行动: