在SVN中跟随符号链接

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

有什么想法吗?你如何处理这种配置?我只需要从简单的svn commit提交/home/me/projects/project1中的所有内容。

1个回答

10

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

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

如果你执行简单的svn add link1,它会向subversion存储库添加一个符号链接条目,但你想要实现的是将其他位置下的内容添加到树中。

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

另一种解决方法是将../../some/where/else位置作为svn位置本身,并将link1作为对该位置的外部定义。当在主目录提交时,外部将同时被提交,从而实现存储信息;但是为了确保其他位置与存储的数据保持同步,你必须确保将其更新为相同版本。

在我的情况下,在我的桌面上有一个设置目录:

$HOME/settings

这是一个目录的检出副本,包含.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 1.7引入的工作副本格式更改,当绑定挂载到svn树的内部时,绑定挂载不起作用 - svn操作试图将文件从.svn/tmp移动到目标文件夹,这将是跨设备链接。在这种情况下的解决方法是从内向外进行,即:

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

由于检出树的单个 .svn 文件夹格式发生变化,您需要从真正的 svn 位置执行所有后续操作,因为在假设您没有在目标位置挂载整个检出树的情况下,它无法从绑定挂载的文件夹中工作。


很棒的答案。我暂时会选择简单的解决方案。 - Cyrille
哦,我刚想起来为什么要这样做(在工作副本中创建指向外部目录的符号链接):我需要www-data用户能够在此目录中写入文件。由于我不想更改我的主目录权限一直到我的工作副本,我想我将不得不浏览您的替代解决方案... - Cyrille
Pete,猜猜哪个符号链接把我带到这里了?;-) 让我们很快将其svn移动! - gatopeich
嗯,“mount --bind”似乎无法与svn1.7.14或1.9.3一起使用,因为我收到“svn:E000018:无法移动...:无效的跨设备链接”的错误提示。 - zhao
行为似乎在svn 1.7中发生了变化,因此svn树内的绑定挂载文件夹不再起作用。相反地,将目标文件夹设置为已检出树的一部分的绑定挂载应该可以实现所需效果。 - Anya Shenanigans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接