【问题标题】:Can the Subversion client (svn) derefence symbolic links as if they were files?Subversion 客户端 (svn) 可以像文件一样取消引用符号链接吗?
【发布时间】:2010-11-25 16:03:10
【问题描述】:

我在 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 版本控制系统。 这些都是很好的想法,我相信它们是解决其他问题的好方法,但考虑到这种环境和情况的限制,它们不会起作用。

【问题讨论】:

  • 我只是认为这是不可能的(而且我认为任何 VCS 都不能做到这一点,它要么遵循符号链接但无法跟踪它们,要么跟踪它们但不遵循) .
  • 开始看起来那样。这似乎很愚蠢,因为大多数操纵路径结构(cp、mv、ln、rm、rsync)的实用程序都有指定符号链接应该被取消引用的选项,而不是按字面意思处理。我的意思是,只是我,还是没有“取消引用”选项会削弱该工具的功能? (如果我一个人在这里,我可能不会费心向 SVN 项目提交功能请求。)
  • 晚了 3 年,但你并不孤单。我也需要这个。

标签: svn symlink dereference


【解决方案1】:

我也面临过类似的挑战。我的主目录包含~/scripts 中的许多脚本,分散在各个子目录中。但是,我希望 SVN 中的布局更简洁,以帮助那些仔细阅读寻找代码示例的同事。

我创建了一个~/scripts/svn/signal15/code/ 目录,下面有prodtest 子目录,然后硬链接所有分散在别处的脚本。

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

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

repo 现在显示 http://svn_server/repos/code/signal15/ 以及“prod”和“test”子目录。

我现在有自定义布局; a) 我的主目录的布局保持不变(没有~/scripts/svn 子目录) b) SVN 存储库包含一个“signal15”分支,其中包含我组织的脚本。 P.S:有了shell功能,我也可以根据需要签入和签出。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        想法:使用 LD_PRELOAD 注入共享库,拦截 stat/open/unlink 等,这样 svn 就看不到符号链接。这将使您不必修改 svn 源代码。

        【讨论】:

          【解决方案5】:

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

          您可以轻松地为 linux 构建自己的 svn,尽管制作这个 mod 可能会也可能不会“容易”。无论如何,如果你没有任何托管的符号链接,你可以做一个粗略的 hack,让 svn 始终跟随它们,就好像它们是硬链接一样。

          如果您的存储库确实包含版本化链接,并且您需要检查其中的那部分,那么您将需要一个更复杂的 hack,例如,使用一个属性来控制每个文件或每个层次结构或其他东西的特性。

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

          【讨论】:

          • 所以,您是说我的实际问题(SVN 客户端可以做到)的答案是“否”。对吗?
          • 对,我是说“不,至少,不是从 1.1.0 开始,也可能不是在它之前”。我想您已经考虑添加其他文件系统树,然后只保留本地未版本化的符号链接。除了需要多次提交或更新来同步整个工作副本之外,这似乎工作得很好。 (但不是在没有本地链接的其他工作副本上。)
          猜你喜欢
          • 1970-01-01
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 2016-08-03
          • 2014-04-09
          • 1970-01-01
          • 2010-10-28
          • 1970-01-01
          相关资源
          最近更新 更多