我熟悉的大多数版本控制工具 [*],以及所有现代工具——CVS、SVN、git、Mercurial、Bazaar——在目录树中都有某种“标记”。
例如,如果您想对文件进行版本控制/a/b/c/file.txt
,您可以在树的某个级别建立一个存储库,例如
/a/b/.bzr
/a/b/.git
/a/b/.hg
/a/b/CVS
大多数 DVCS 实际上将版本历史存储在这个“标记”中。CVS 没有 - 相反,CVS 目录包含告诉您如何访问实际存储库的文件(基本上是链接,尽管不是符号链接或硬链接)。此外,CVS 在工作树的每个子目录中都放置了一个链接“CVS”目录,该目录将该目录链接到它在某个存储库中的位置。(不一定相同。)
问:是否有任何现代 DVCS 工具不需要文件系统中的此类链接或标记。
例如,版本控制下的文件是
/a/b/c/file.txt
但是存储库在
/x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt}
其中 {a/b/c/file.txt} 部分不一定是目录路径,但可能是数据库中的条目。
这样您就可以从存储库中执行以下操作:
> cd /x/y/z/repo
> DVCS-TOOL add /a/b/c/file.text
Warning: /a/b/c/file.txt is not under the repository /x/y/z.
Are you sure that you want to add such an outside-repository file? [y/n] y
Absolute or relative path? [ar] a
> DVCS-TOOL ci
/a/b/c/file.text --ci--> /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt}
> rm /a/b/c/file.txt
> DVCS-TOOL status
Missing /a/b/c/file.text --in-repo-as--> /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt}
> DVCS-TOOL revert
/a/b/c/file.text <--reverted-from-- /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt}
> echo 'stuff' >> /a/b/c/file.txt
> DVCS-TOOL ci
/a/b/c/file.text --ci--> /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt}
在回购之外,您可能会这样做:
> cd /a/b/c
> echo 'more stuff' >> file.txt
> DVCS-TOOL -repo /x/y/z/repo ci
/a/b/c/file.text --ci--> /x/y/z/repo/.DVCS-TOOL/{a/b/c/file.txt}
动机:
我对我的主目录进行版本控制,以及我对我的系统所做的其他更改,无论是 Linux、Cygwin 还是 Windows。
当然,我可以管理 cygwin /
,这样我就可以签入原始文件以及我对 和 等文件所做的/etc/bash.bashrc
更改/usr/local/etc/foo.rc
。例如,我可以创建一个/.bzr
. (更多时候,我只签入我已更改的某些文件,而不是整个树,依赖于能够检索发行版。)
另外,我可以在我拥有的或拥有 root 权限的 UNIX/Linux 系统上执行此操作。
但是,如果我没有对 的写访问权限/
,但是对/usr/etc/foo/bar
和/etc/baz/bif
...并且不想拥有两个单独的存储库,而是想要一个“稀疏存储库”。
或者,如果我想随时吹走/cygwin
,但仍然可以方便地映射
/a/b/my-repo/{cygwin/etc/bash.bashrc}
到/cygwin/etc/bash.bashrc
(并且,哎呀,可能/etc/bash.bashrc
在其他系统上)
或者,我今天遇到的 Windows 示例:我想对文件进行版本控制,例如
C:\Users\[USERNAME]\AppData\Roaming\Adobe\FrameMaker\11\Maker.ini
或者,cygwin 路径
/cygdrive/c/Users/glew/AppData/Roaming/Adobe/FrameMaker/7.2/maker.ini
但我不想在 C:.hg 或 C:\Users\glew.hg 或 ...
我只想拥有一个 repo,和/或基于或链接到该 repo 的工作区,以及知道如何处理实际上不在 repo/workspace 下的目标文件的命令。
问:您知道有这样的现代 DVCS 工具吗?
问:如果有,怎么做?
例如,我隐约知道 bzr 允许工作区共享存储库 - 但 AFAIK 仍然需要一个 /a/b/workspace/.bzr 文件将工作区链接到存储库。所以我需要比“看看集市”更多的细节。
例如,我知道 hg 有一个 --repository 选项。但它不符合我的要求:
> cd /tmp
> mkdir tmp1; cd tmp1
./tmp1
> hg init
> cd ..
> mkdir tmp2; cd tmp2
./tmp2
> bar.txt
> hg --repository ../tmp1 add bar.txt
abort: bar.txt not under root '/tmp/tmp1'
注意 *:我之所以说“我熟悉的大多数版本控制工具,以及所有现代工具......”是因为“盒子、链接和并行树:配置管理的元素”中描述的工具系统。” 在软件管理会议的研讨会论文集中。1989 年。
有这样的特点。或者,更确切地说,具有这样的功能。
不好意思,我是作者。但是,不,真的,我问这个问题并不是为了满足自我——当我开始写这个问题时,我忘记了这篇论文。
此外,本文中描述的工具已经过时且早已不复存在,多年前被雇主遗忘。当然不是现代的 DVCS。
是的,我知道:Brian Berliner 在他的 CVS 论文中讨论了我的论文。他是错的,我是对的,但这是另一个问题。(Brian 对活锁的可能性很满意,但我不是。)
无论如何,我只是希望这个非常古老的概念,即存储库和存储库外部文件之间的映射 - 在一些现代 DVCS 工具中重新出现。因为我想使用它,如上所述。