遵循SVN中的符号链接

Cyr*_*lle 10 linux svn symlink ln symlink-traversal

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

/home/me/projects/project1
Run Code Online (Sandbox Code Playgroud)

在这个项目中,我需要SVN(1.8.8)来跟踪符号链接"link1":

/home/me/projects/project1/link1/<some_directories_and_files>
Run Code Online (Sandbox Code Playgroud)

但是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
Run Code Online (Sandbox Code Playgroud)

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

ln /path/to/my/linked/directory link1
ln: ‘/path/to/my/linked/directory’: hard link not allowed for directory
Run Code Online (Sandbox Code Playgroud)

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

Pet*_*esh 8

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

project1/
project1/link1 -> ../../some/where/else
Run Code Online (Sandbox Code Playgroud)

如果你做一个简单的svn add link1事情,就会在subversion存储库中添加一个符号链接条目,但你要完成的是将其他东西放到树中.

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

另一个解决方案是将位置设置../../some/where/else为svn位置,并使link1成为该位​​置的外部定义.当您在主目录中提交时,外部将同时提交,这将实现存储信息; 但是为了确保其他位置保持同步,您必须确保将其更新为与存储数据相同的版本.

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

$HOME/settings
Run Code Online (Sandbox Code Playgroud)

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

如果你真的希望svn遵循符号链接作为硬链接(你不能制作目录硬链接,因为这将是一件坏事),那么你将不得不破解svn客户端源,以便它做你想要的; 但这将是一场维护噩梦.

可以将符号链接变成一个指向目标的绑定挂载点,但这有它自己的问题 - 你需要成为root来完成这个,它最终会在/ proc/mounts中留下有趣的条目来完成这个:

mount --bind /absolute/path/to/some/where/else project1/link1
Run Code Online (Sandbox Code Playgroud)