5

我把 Mask 想象成电路 Mask(我想)——让我用一张方便的图表来解释

掩码图

共同的来源将在物理上c:\source

实例 A 将在物理上,c:\instanceA但最初只有符号链接到其中的所有内容c:\source

实例 B 将在物理上,c:\instanceB但最初只有符号链接到其中的所有内容c:\source

当您对 Instance A 和 Instance B 进行更改时,您将创建一个掩码,如果文件从 Instance 文件夹中删除,它将隐藏 CommonSource 中的文件,如果现有的 Common Source 文件被修改,则在实例目录中创建一个新的物理文件。新文件将存在于实例文件夹中,但永远不会回到公共源。

这种类型的设置对于我想要对多个实例进行许多不同类型的小调整的项目非常有用,其中不同的线程将在不同的实例上工作。

我知道符号链接,但在修改文件的情况下它们不够用。

有什么可以做到这一点吗?如果没有,我应该尝试制作这个并申请专利吗?对我来说似乎是个好主意。

我将使用 Windows Server 2008 或更高版本。

4

5 回答 5

8

担心我说的很明显,但git是一种可用于实现此行为的工具。

  1. 使您的“公共源”成为 git 存储库
  2. 将存储库克隆两次到“InstanceA”和“InstanceB”
  3. 在每个实例中,检查一个新的、唯一的分支

由于在“公共源”中进行了更改,您可以将这些更改合并到“InstanceA”和“InstanceB”中,同时维护您为每个创建的“MASK” (对分支的更改) 。

这有一个额外的好处,即允许根据需要从“公共源”中提取更改,而不是将“公共源”的更改送到每个实例(我认为这不太理想并且更容易出错)

于 2012-07-11T02:34:36.263 回答
2

你正在寻找一个联合坐骑。不幸的是,我不知道有任何适用于 Windows 的实现,但有几个适用于 Linux,尤其是UnionFS

通常,它们用于使只读文件系统看起来像是可读写的:通常在 live-CD 上。

于 2012-07-20T16:38:15.393 回答
1

从 Windows 7 开始,您可以使用,这将允许您包含来自多个物理位置的文件。

Windows 7 还包括 VirtualStore 类型的文件夹(例如,在 Program Files 文件夹中创建或修改文件时,它实际上会在用户特定文件夹中创建:C:\Users\user\AppData\Local\VirtualStore。但是 - 我不知道如何自己创建此类文件夹,而且据我所知,您可以添加和修改文件,但不能以这种方式删除文件。

于 2012-07-18T19:16:28.647 回答
1

您需要一个支持每个文件签出和权限的版本控制系统。然后,您只需要设置一个简单的 API 转换器,它接受文件系统命令并将它们转换为版本控制命令。

删除 -> 禁用访问文件的权限。

目录命令应该查找本地副本和您有权访问的内容。

打开 -> 获取本地副本,从存储库中检出文件失败。

保存 -> 禁用权限,保存本地副本。//避免重复出现。

关闭而不保存 -> 如果有权从存储库访问,则删除本地副本。

((顺便说一句,这种存储优化对于版本控制似乎有些虚假。磁盘空间相对便宜。

如果您对版本控制不感兴趣,我建议您考虑分离出您可能想要的易失性信息并为每个分支创建配置文件。当然,这需要对变化有可预测的模式。))

于 2012-07-20T14:13:37.007 回答
1

IBM Rational ClearCase是执行类似文件掩码行为的版本控制系统。它被称为MVFS:多版本文件系统,可以像普通网络驱动器一样安装到工作站。

ClearCase 服务器(又名 VOB)您可以存储同一文件的多个版本,每个版本位于不同的代码分支上。用户可见的文件集称为视图。每个视图都有一个配置(又名配置规范),它定义了哪些文件和版本对当前用户可见。典型文件如下所示:

# From wikipedia: http://en.wikipedia.org/wiki/IBM_Rational_ClearCase#Configuration_specifications
# Show all elements that are checked out to this view, regardless any other rules.
element * CHECKEDOUT

# For all files named 'somefile', regardless of location, always show the latest version
# on the main branch.
element .../somefile /main/LATEST

# Use a specific version of a specific file. Note: This rule must appear before
# the next rule to have any effect!
element /vobs/project1/module1/a_header.h /main/proj_dev_branch/my_dev_branch1/14

# For other files in the 'project1/module1' directory, show versions
# labeled  'PROJ1_MOD2_LABEL_1'. Furthermore, don't allow any checkouts in this path.
element /vobs/project1/module1/... PROJ1_MOD2_LABEL_1 -nocheckout

# Show the 'ANOTHER_LABEL' version of all elements under the 'project1/module2' path.
# If an element is checked out, then branch that element from the currently
# visible version, and add it to the 'module2_dev_branch' branch.
element /vobs/project1/module2/... ANOTHER_LABEL -mkbranch module2_dev_branch
于 2012-07-20T14:26:33.740 回答