mercurial:如何在没有服务器的情况下更新生产文件(编辑:解决方法+非MS Windows解决方案)

时间:2013-06-13 10:57:10

标签: mercurial share

我需要控制通过SMB共享访问的几个文件的版本。这些文件将被几个人修改。文件本身直接由Web服务器使用。

由于这些是生产文件,我想强制用户提取本地副本,编辑它们,提交并推回它们。不幸的是,该机器上没有Mercurial服务器。

在我这边配置Mercurial的合适方法是什么:

  • 版本控制(.hg目录)保留在共享
  • 并且共享中的文件是最新版本?

我无法访问此服务器(通过共享除外)。如果我可以在该机器上安装一个mercurial服务器,我会使用一个钩子来更新生产目录中的文件(我这样说只是为了突出我想要实现的目标 - 这种方法是不可能的,因为我不控制该服务器)

谢谢!

更新:我最终使用了一个中间服务器(我已经控制了)。 changegroup上的一个钩子会触发一个脚本 i) hg update以获取新的本地文件 ii)将它们复制到SMB共享

编辑1 在使用alex的评论中进行讨论后,我查看了命令行输出的详细版本。 \\srv\hg\test1个回购邮件的[hooks]部分为changegroup = hg updatehg push -v的输出提供了一些见解:

pushing to \\srv\hg\test1
query 1; heads
(...)
updating the branch cache
running hook changegroup: hg update
'\\srv\hg\test1'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.
abort: no repository found in 'C:\Windows' (.hg not found)!
warning: changegroup hook exited with status 255
checking for updated bookmarks
listing keys for "bookmarks"

如果我正确理解上面的输出:

  • 在客户端上触发了cmd.exe,即使[hook]位于接收服务器上
  • 它试图更新远程仓库
  • ...但由于不支持UNC而失败

所以alex的答案是正确的 - 它只是在MS Windows上无效(但是?)。 (如果我错了,请在评论中纠正我)

2 个答案:

答案 0 :(得分:0)

是什么阻止您安装Samba共享并在那里运行hg init?您不需要mercurial服务器(hg serve或更复杂的东西)来执行推/拉操作。

答案 1 :(得分:0)

如果我理解正确,你正在寻找两件事:

  1. 一个存储库挂钩,每当有人推送它时,它会自动将生产存储库更新到最新版本。这很简单:您正在寻找this question.

  2. 的答案
  3. 如果你可以依靠你的同事总是通过pull-commit-push过程,你就完成了。如果不是这种情况,您需要一种方法来阻止人们修改生产文件并且永远不会提交它们。

  4. 不幸的是,我不认为您可以选择性地保留对SMB共享上已签出文件(但不包括回购)的写入权限。但是你可以通过使文件的位置不那么明显来阻止直接修改。也许您可以将人们引导到第二个存储库,配置为将所有推送到它的内容立即推送到生产存储库。这个repo根本不需要有文件的签出版本(用hg clone -U创建它,或者之后再做hg update -r 0),消除了绕过mercurial的诱惑。