我熟悉的大多数版本控制工具[*]以及所有现代工具 - 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工具中重新浮出水面。因为我想使用它,如上所述。
答案 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/objects
和examples/zpipe.c
来管理您在cat -A
中显示的文件。
研究工作和所有,你可以预算一个美好的一天,以建立你想要的。
答案 2 :(得分:0)
Bazaar具有轻量级结帐操作模式,只能将足够的元数据放入.bzr文件夹,以允许它与原始仓库进行通信,以进行任何需要历史数据的操作。这甚至可以用于远程回购的检查,尽管这些操作自然会慢一些。