11

我有一个 linux 目录(并且不需要任何 windows 结帐):

/home/me/projects/project1

在这个项目中,我需要 SVN (1.8.8) 遵循符号链接“link1”:

/home/me/projects/project1/link1/<some_directories_and_files>

但是 SVN 不会让我这样做,它只是添加link1而不是它的内容。如果我尝试添加其内容,则会收到错误消息:

svn add link1/*
svn: E145001: Can't schedule an addition of '/home/me/projects/project1/link1/first_directory' below a not-directory node

我尝试将 link1 转换为硬链接,但我也不能这样做:

ln /path/to/my/linked/directory link1
ln: ‘/path/to/my/linked/directory’: hard link not allowed for directory

任何的想法?你如何处理这种配置?我只需/home/me/projects/project1要从一个简单的地方提交所有内容svn commit

4

1 回答 1

10

如果我理解你的问题,你有:

project1/
project1/link1 -> ../../some/where/else

如果您做一个简单的操作svn add link1,它会向 subversion 存储库添加一个符号链接条目,但是您要完成的是将其他地方的东西放入树中。

如果是这种情况,那么你的方向是错误的,你应该在 link1 下创建真正的文件和目录,并将目标位置符号链接到 link1 目录中。这将是解决问题的简单方法。

另一种解决方案是使该位置../../some/where/else本身成为 svn 位置,并使 link1 成为该位置的外部定义。在主目录commit时,externals会同时commit,从而实现信息的存储;但是,要确保其他位置保持同步,您必须确保将其更新为与存储数据相同的版本。

就我而言,在我的桌面上,我有一个设置目录:

$HOME/settings

这是一个目录的检出副本,其中包含来自repo的.bashrc.profile.vimrc.vim等文件和文件夹。svn我的所有配置文件和目录都是指向此文件夹的符号链接,例如.profile->settings/.profile等。当我进行更改时,它们会反映在 svn 树中,我可以将其提交回以确保我不会丢失我的当我去另一个系统时配置设置。

如果您真的希望 svn 将符号链接作为硬链接(您不能创建目录硬链接,因为这将是一件坏事™),那么您将不得不破解 svn 客户端源代码,以便它执行您想要的操作;但这将是维护的噩梦。

可以将符号链接设置为指向目标的绑定挂载点,但这有其自身的问题 - 您需要成为 root 才能完成此操作,并且最终会在 /proc/mounts 中留下有趣的条目来完成这:

mount --bind /absolute/path/to/some/where/else project1/link1

绑定挂载在挂载到 svn 树内部时不起作用,因为 svn 1.7 引入了工作副本格式更改 - svn 操作尝试将文件从 .svn/tmp 移动到目标文件夹,这将是一个跨设备链接。在这种情况下,解决方法是从内到外,即:

mount --bind project/link1 /absolute/path/to/somewhere/else

随着签出树的单个 .svn 文件夹的 svn 工作副本格式的更改,您将需要从真正的 svn 位置执行所有后续操作,因为它不会在绑定安装文件夹中工作,假设您尚未在该目标位置安装整个签出树。

于 2014-07-20T13:34:28.937 回答