3

我熟悉的大多数版本控制工具 [*],以及所有现代工具——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 工具中重新出现。因为我想使用它,如上所述。

4

3 回答 3

4

你确实可以使用 Git。

检查这个答案我可以将 .git 文件夹存储在我想要跟踪的文件之外吗?

基本上,您可以在任意位置创建 .git 文件夹,然后将 git core.worktree 配置设置为应进行版本控制的目录。

git help config在 core.worktree 部分下也有很多信息。

于 2013-10-08T20:34:42.957 回答
1

ssmith 回答了标题请求,但阅读动机让我想建议更深入地挖掘 git 的真正能力。“完全访问内部”不是某个黑暗的角落,而是构建许可证。

你已经花了足够多的时间阅读手册,以至于 gitcore 教程可能不需要两袋爆米花来吸入。我建议git ls-files -s在它引入之后立即搜索git update-index,因为它是一个几乎完整的索引转储;并且使用
git init --template=/dev/null而不是仅仅git init因为默认情况下有些杂乱无章,这在某种程度上掩盖了这一切的赤裸裸的简单性;并在find -type f您进行时自由地做。要完成困惑,请将您看到的文件.git/objects通过 zlibexamples/zpipe.ccat -A.

研究工作和所有工作,您可以预算一个美好的一天来构建您想要的东西。

于 2013-10-10T22:09:04.210 回答
0

Bazaar 有一个轻量级的结帐操作模式,它只将足够的元数据放入 .bzr 文件夹,以允许它与原始存储库进行任何需要历史数据的操作。这甚至适用于远程回购的结帐,尽管这些操作自然会更慢。

于 2013-10-08T20:39:04.317 回答