我知道我迟到了,但我希望其他人可以从我的回答中受益,即使提问者可能已经很久了。
一些背景
unixoid 系统和 Windows 之间的符号链接语义有很大不同。如前所述,Windows 使用重解析点来实现符号链接和连接点(服务器版本上的一些重复数据删除功能似乎也使用了它)。
现在,重解析点包含额外的数据,作为 I/O 管理器和对象管理器的提示。本质上,基于重解析点标记(GUID)可以确定重解析点的类型,然后文件系统过滤器驱动程序处理详细信息。您可以在第 6 版的“Windows Internals”第 9 章或最近的 Windows Driver Kit 或 MSDN 上的REPARSE_GUID_DATA_BUFFER(和相关主题)下找到对此的适度详细描述。
在 unixoid 系统上,文件系统元数据还包含(文本文件)是符号链接的线索。如果您使用ls -l,则该线索以前导l 的形式可见,例如在:
lrwxrwxrwx 1 user group 38 2015-10-12 11:51
符号链接的实际内容也是系统特定的,例如在 Linux 上,它们仅包含目标路径。
Windows 和 *nix 符号链接的共同点是目标在创建时不需要存在。同样在 Windows 上,符号链接可以指向网络位置,这很特殊因为在 Windows 上的网络路径与本地路径不同。
可能的兼容性
假设在 OSX 或 Linux 端创建了符号链接,我们可以想象一定程度的兼容性。如果 Windows 端的文件系统驱动程序现在将符号链接呈现为重解析点,并且某些方(所述文件系统驱动程序或文件系统过滤器)将处理这些重解析点,则可以解释符号链接的目标路径某种方式。
然而,将正斜杠转换为反斜杠是最不值得关注的问题。
在this answer 中,我已经概述了一些不可能进行有意义翻译的情况。
基本上我认为唯一可能兼容的符号链接类型是相对符号链接。但即使对于那些有必要指出目标路径可能不会指向在 Windows 端可见的文件夹层次结构之外。也就是说,如果您在 OSX 或 Linux 端的符号链接驻留在 inside /var/www/html 并指向 ../../../something,则在 /var 是 Windows 上已安装的卷的情况下它变得毫无意义。
但是,如果这样的符号链接 /var/www/html/foobar 和指向 ../html1/foo/bar 的可能性是,如果 /var 是 OSX 或 Linux 上的挂载卷,现在在 Windows 上,则相对目标路径仍然有意义(经过调整,例如正斜杠等)。
对于任何绝对目标路径,文件系统驱动程序或文件系统过滤器驱动程序必须获得一些关于如何将符号链接的源形式转换为目标形式的提示。
例如如果符号链接指向/home/foo/bar,/home 部分可能会转换为特定的已安装卷。
但是您已经可以看到,这需要大量的用户干预,这可能就是为什么大多数人会认为即使尝试有意义的翻译也是徒劳的。
SVN 的可能解决方法
您可能的解决方法是使用 SVN 外部。这取决于具体的场景,但由于您使用的是 SVN,因此您会想到它们。
您可以将 SVN 外部视为 Subversion 的本地符号链接。我以这种方式使用过它们,并且我知道其他几个人也使用过,但我不知道这种思路和后续用法有多普遍。
注意:指向文件的外部对象 仅在 SVN 1.6 中引入,因此在您的场景中这可能是也可能不是问题。
SVN externals come in several flavors。您可以为文件夹或文件(仅 1.6 及更高版本的文件)设置它们。
外部可以指向:
- 外部回购 (
schema://server/path)
- 相对于同一个 repo (
^/path)
- 相对于架构 (
//server/path) 或
- 相对于父目录
您可能需要该列表中的 2 或 4 个。不过,您很可能需要 4 个,因为 file externals 必须指向同一个存储库。
长话短说
如果您的图像位于诸如 trunk/images 之类的文件夹中,并且您有一个文件夹 trunk/platforms/windows/images,您可以将 trunk/platforms/windows 上的 svn:externals 属性设置为有一个名为 images 的外部指向 ../../images (即外部目录),或者假设您想在trunk/platforms/windows/images 下使用不同的层次结构或不同的名称,您可以像这样创建文件外部(images 子目录必须存在于 WC 中):
cd trunk/platforms/windows
svn propedit svn:externals images
并像这样添加单独的外部:
../../../images/filename.jpeg other-filename.jpeg
请注意,目标目录需要存在于存储库和工作副本中,所以对于这样的外部:
../../../images/filename.jpeg foo/other-filename.jpeg
子目录trunk/platforms/windows/images/foo必须存在。
更新您的工作副本将导致这些外部文件在工作副本中显示为版本化文件。因此它们是一种存在于 SVN 中的符号链接,并在工作副本中显示为适当的文件,这意味着 所有 平台都可以平等地处理它们。