Subversion客户端(svn)可以取消引用符号链接,就好像它们是文件一样吗?

时间:2009-09-04 14:47:01

标签: svn symlink dereference

我在Linux系统上有一个目录,主要包含不同文件系统上文件的符号链接。我想将目录添加到Subversion存储库,解除引用过程中的符号链接(将它们视为它们指向的文件,而不是链接)。通常,我希望能够处理任何具有此行为的工作副本操作,但我认为'svn add'命令就是它启动的地方。

SVN客户端实用程序似乎没有与工作副本中的符号链接解除引用相关的任何选项。我在手册(http://svnbook.red-bean.com/en/1.5/index.html)中也没有找到任何引用。

我在SVN用户邮件列表上发现了一张海报,他提出了同样的问题,但从未收到答案,在这里:

(那张海报最后使用的是硬链接而不是符号链接。在我的情况下,这种技术不是一种选择,因为真正的底层文件驻留在一个单独的文件系统上。)

我在Fedora 11上使用Subversion v1.6.1。

对于它的价值,我知道有其他工具/技术可以帮助估算这种行为,但由于各种原因我必须抛弃它。我已经考虑过这些可能性[和灰尘分类]:      - 一个“联合”安装,合并包含真实文件的所有目录,SVN工作副本目录作为联合中的“顶层”;      - 将真实文件复制/移动到与SVN工作副本相同的文件系统,并使用硬链接而不是符号链接;      - 非SVN版本控制系统。 这些都是巧妙的想法,我相信它们是解决其他问题的好方法,但考虑到这种环境和情况的限制,它们不会起作用。

5 个答案:

答案 0 :(得分:1)

你有很多限制,但有一件事总是有效的:破解来源。

您可以轻松地为Linux构建自己的svn,尽管使这个mod可能或者可能不“简单”。无论如何,如果你没有任何托管的符号链接,你可以做一个粗暴的黑客,只是让svn始终跟着它们,好像它们是硬链接一样。

如果您的存储库确实包含版本化链接,并且您需要检查其中的一部分,那么您将需要更复杂的黑客,例如,使用控制每个文件或每个层次结构或其他内容的功能的属性。< / p>

可能还有另一种选择:版本化链接出现在1.1.0中,如果之前的行为是遵循符号链接,那么也许你可以运行一个旧客户端。

答案 1 :(得分:0)

想法:使用LD_PRELOAD注入一个共享库,拦截stat / open / unlink等,以便svn看不到符号链接。这将使您免于修改svn源。

答案 2 :(得分:0)

您也可以使用物理链接而不是符号链接。

答案 3 :(得分:0)

据我所知,使用当前的subversion版本(1.6.x),没有办法做到这一点。如果它是针对同一文件系统上的文件(而不是目录),则可以使用硬链接(没有-s命令中的ln开关。)

答案 4 :(得分:0)

我遇到了类似的挑战。我的主目录包含许多分散在各个子目录中的~/scripts脚本。但是,我希望在SVN中使用更清晰的布局,以便让同事们仔细阅读代码示例。

我创建了一个~/scripts/svn/signal15/code/目录,其中包含prodtest个子目录,然后硬链接所有分散在其他地方的脚本。

然后,以下命令导入了我需要的目录/文件布局;

cd ~/scripts ; svn import svn http://svn_server/repos/code

现在,repo显示http://svn_server/repos/code带有“prod”和“test”子目录。

我现在有自定义布局; a)我的主目录的布局保持不变(没有http://svn_server/repos/code/signal15/子目录) b)SVN存储库包含一个带有组织脚本的“signal15”分支。 P.S:具有shell功能,我也可以根据需要办理登机手续和退房手续。