ISO是一种版本控制工具,可以管理不在由VC工具管理的目录树下的文件

时间:2013-10-08 19:24:43

标签: git version-control mercurial dvcs bazaar

我熟悉的大多数版本控制工具[*]以及所有现代工具 - CVS,SVN,git,Mercurial,Bazaar - 在目录树中都有某种“标记”。

E.g。如果你想要版本控制文件/a/b/c/file.txt,你可以在树的某个层面建立一个存储库,例如。

/a/b/.bzr
/a/b/.git
/a/b/.hg
/a/b/CVS

大多数DVCS实际上将版本历史存储在此“标记”中。 CVS没有 - 相反,CVS目录包含告诉您如何到达实际存储库的文件(基本上是链接,但不是符号链接或硬链接)。此外,CVS在工作树的每个子目录中放置一个链接“CVS”目录,该目录将该目录链接到它在某个存储库中的位置。 (不一定相同。)

问:有没有现代DVCS工具在文件系统中不需要这样的链接或标记。

E.g。版本控制下的文件是

/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。 (更常见的是我只检查我已更改的某些文件,而不是整个树,依赖于能够检索发行版。)

另外,我可以在我拥有的UNIX / Linux系统上执行此操作,或者使用root。

但是,如果我没有/的写入权限,而是/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工具吗?

问:如果是,怎么做?

E.g。我隐约知道bzr允许工作空间共享存储库 - 但是AFAIK仍然需要一个将工作空间链接到存储库的/a/b/workspace/.bzr文件。所以我需要更多的细节,而不是“看看Bazaar”。

E.g。我知道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论文中废弃了我的论文。他错了,我是对的,但这是另一个问题。 (布莱恩对活锁的可能性很满意,我不是。)

无论如何,我只是希望这个非常古老的概念,即存储库和存储库外的文件之间的映射 - 在一些现代DVCS工具中重新浮出水面。因为我想使用它,如上所述。

3 个答案:

答案 0 :(得分:4)

你确实可以用Git。

检查此答案Can I store the .git folder outside the files I want tracked?

基本上你可以在任何地方创建.git文件夹,然后将git core.worktree配置设置为应该版本化的目录。

core.worktree部分下的git help config中还有很多信息。

答案 1 :(得分:1)

ssmith answered标题要求,但阅读动机让我想建议深入挖掘git真正能干的东西。 "Full access to internals"不是一个黑暗的角落,它是建造许可证。

你已经花了很多时间阅读手册,gitcore tutorial可能不会吸入两袋爆米花。我建议在引入git update-index之后立即寻找git ls-files -s,因为它是一个完整但完整的索引转储;并使用
git init --template=/dev/null而不仅仅是git init,因为默认情况下的残缺有些模糊了它的简单性;在你继续进行时,find -type f自由地做着。要完成这一困惑,请通过zlib的.git/objectsexamples/zpipe.c来管理您在cat -A中显示的文件。

研究工作和所有,你可以预算一个美好的一天,以建立你想要的。

答案 2 :(得分:0)

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