SVN,Samba和符号链接。如何让他们一起玩?

时间:2010-03-08 11:30:19

标签: svn tortoisesvn samba symlink

我有一个受版本控制的网站项目,该项目依赖于来自同一服务器上的无版本目录的文件,通过符号链接。

我目前正在存储库中存储符号链接。我们的想法是,如果有人将工作副本签出到同一服务器上,他们可以在将项目提交回存储库之前编辑和测试项目的工作副本。

当他们签出工作副本时,它会成功设置符号链接,以便整个网站在测试时都能正常工作。

在项目上工作的用户是Windows用户,因此我在服务器上设置了samba共享,然后将它们映射到Windows中的网络驱动器。人们可以通过网络共享直接在服务器上编辑工作副本,然后在Web浏览器中测试它们,然后通过TortoiseSVN将更改提交回存储库。

问题

我遇到的问题是Samba按预期解析了符号链接但是当用户尝试将更改提交回存储库时,TortoiseSVN认为链接文件是项目的一部分并尝试将目标文件提交到存储库并且不是符号链接本身。

我尝试关闭samba中的符号链接支持,这意味着无法解析链接文件,因为我真的不希望人们有权访问链接文件,也不想导入存储库中的链接文件。这个问题是我得到Can't stat '\\webserver\projects\working\project\symlinked_file.php'. Access is denied

除了符号链接问题,其他一切工作100%完美。用户可以将网站项目签出到他们的机器上并对其进行操作(但无法测试)或将它们签出到开发Web服务器上的空间并进行处理并进行全面测试。所以我不想改变工作流程,我只需要解决符号链接问题。

非常感谢。

3 个答案:

答案 0 :(得分:2)

我决定从存储库中删除符号链接。然后我创建了一个bash脚本,提示用户在其工作副本中创建符号链接。我必须确保关闭Samba的follow symlinks选项以阻止TortoiseSVN尝试将链接文件添加到存储库。

还应注意,当用户使用TortoiseSVN执行提交时,它将显示更改日志中的链接,但不会检查它们,因此不会将其添加到存储库中。你只需要忽略它们。

答案 1 :(得分:1)

您是否可以在NTFS symlinks旁边使用UNIX符号链接来保持与Windows的兼容性?或者,您可以随时对其他文件进行版本控制,并使用svn:externals链接到它们。

答案 2 :(得分:0)

Aight,经过几个选项之后,这就是我最终的结果:问题是Windows不知道符号链接,但是Tortoise也没有在Windows结账时销毁它们。然后解决方案是让人们自己在Windows共享上进行检出,然后找到一种方法来重新添加符号链接。

当然,只是覆盖它们不是一种选择,因为Tortoise会抱怨改变文件/目录等等。我们想让它们孤立无援。对于在符号链接目录中具有静态图像/其他资源的Web服务器,Apache配置中的简单Alias可以工作,但是,我们的代码库还包括符号链接的代码。

在debian下,unionfs-fuse解决了这些麻烦。似乎在这里工作的配方:

  • 在linux服务器(svnroots)的某处创建基本签出。
  • 创建一个dir,我们将创建一个'overlay'(尸体)。
  • 在svn-checkouts目录中搜索符号链接,并在尸体中重新创建它们:

for file in `find $DEVPATH/svnroots/ -type l`;do
       path=`dirname $file | sed "s,$DEVPATH/svnroots,$DEVPATH/carcass,g"`
       mkdir -p $path
       path=$path/`basename $file`;
       ln -s `readlink $file` $path;
done
  • 创建所需的目录(包含来自其共享的人员文件,但存储在subversion中的符号链接:

for user in ${windowsusers[@]};
    unionfs-fuse -o cow,allow_other,suid,uid=33,gid=33 $DEVPATH/carcass=ro:$DEVPATH/$user/=rw $DEVPATH/correct_dirs/$user
done

在该目录上的读/写将转到users目录,尸体目录是只读的,但覆盖在users目录中,从而产生正确的符号链接。脚本很容易重新运行subversion中的符号链接更改(并且不需要重新安装:尸体中的更改直接反映在correct_dirs中。)