git - ISO 一个版本控制工具,可以管理不在标记为由 VC 工具管理的目录树下的文件

标签 git version-control mercurial dvcs bazaar

我熟悉的大多数版本控制工具 [*],以及所有现代工具——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 目录包含告诉您如何访问实际存储库的文件(基本上是链接,尽管不是符号链接(symbolic link)或硬链接(hard link))。此外,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}

在 repo 之外,您可能会这样做:
> 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 / , 这样我就可以 checkin 原始文件以及我对 /etc/bash.bashrc 等文件所做的更改和 /usr/local/etc/foo.rc .例如。我可以创建一个 /.bzr . (更多时候,我只 checkin 我已更改的某些文件,而不是整个树,依赖于能够检索发行版。)

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

但如果我没有对 / 的写入权限, 但对 /usr/etc/foo/bar 做和 /etc/baz/bif ...并且不想有两个单独的 repo ,而是想要一个“稀疏 repo ”。

或者如果我想吹走/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 或 ...

我只想拥有一个存储库,和/或基于或链接到该存储库的工作区,以及知道如何处理实际上不在存储库/工作区下的目标文件的命令。

问:您知道有这样的现代 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'

注意 *:我之所以说“我熟悉的大多数版本控制工具,以及所有现代工具......”是因为
“盒子、链接和平行树:配置管理系统的元素。”
在软件管理 session 的研讨会论文集中。 1989 年。

有这样的特点。或者,更确切地说,具有这样的功能。

不好意思,我是作者。但是,不,真的,我问这个问题并不是为了满足自我——当我开始写这个问题时,我忘记了这篇论文。

此外,本文中描述的工具已经过时且早已不复存在,多年前被雇主遗忘。当然不是现代的 DVCS。

是的,我知道:Brian Berliner 在他的 CVS 论文中讨论了我的论文。他是错的,我是对的,但这是另一个问题。 (Brian 对活锁的可能性很满意,但我不是。)

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

最佳答案

你确实可以使用 Git。

看看这个答案Can I store the .git folder outside the files I want tracked?

基本上,您可以在任意位置创建 .git 文件夹,然后将 git core.worktree 配置设置为应进行版本控制的目录。
git help config中也有很多信息在 core.worktree 部分下。

关于git - ISO 一个版本控制工具,可以管理不在标记为由 VC 工具管理的目录树下的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19256514/

相关文章:

git - 如何在 SourceTree 中 merge develop 分支到 master 分支?

Git amend - 在子分支上看不到修改提交更改的更改

version-control - crontab 版本控制?

version-control - 对于一个非常小的团队来说,最好的跨平台版本控制系统是什么?

svn - 找不到子存储库 'svn' 的错误 '<folder name>' 可执行文件

powershell - Mercurial:自动添加子存储库的 Windows 脚本

git - 如何使用来自 GitLab 管道的 key 通过 SSH 连接到目标服务器?

git - 配置存储库以使用我的RSA key

git - 通过 pull 请求解决 merge 冲突

mercurial - 如何在 mercurial 中为我的最后一次提交取消提交(尚未推送)