一个目录(同一级别)中的多个存储库 - 是否可能?

时间:2011-04-14 09:25:41

标签: version-control

我最初的问题是我有一个编写各种脚本的目录。它们中的每一个都独立于其他人,通常是一个文件长。我想对它们应用一些版本控制,但我有以下问题/要求:

  1. 不希望 必须将每个小脚本存储在单独的目录中!
  2. 不希望 所有存储在一个存储库 OTOH中,因为它们完全不相关,和:
    • 其中一些可能会成长为更多文件(然后他们需要一个单独的目录),
    • 我有时想将其中一个复制到另一台机器上(我想克隆整个仓库)。
  3. 想要 从(分布式)版本控制机制中受益 - 至少:
    • “无限”修订版数量,
    • 在不同计算机上克隆存储库的能力,
    • 能够进行“原子”多文件提交。
  4. 有可能吗?
    我更喜欢在一些主流的分布式VCS中使用它(使用Mercurial的解决方案会更好,但我没有修复)。

    编辑:解决方案必须是免费的(至少“像啤酒一样”)和跨平台(至少是Win32和Linux)。

    相关,但没有帮助:

7 个答案:

答案 0 :(得分:5)

这些要求对我来说似乎很“特别”,所以这里有一个与他们相同的解决方案^^

您可以在同一目录中使用两个完全不同的VCS。甚至SVN的两个“实例”也可能有效:SVN将其元数据存储在名为.SVN的目录中,并且(由于历史原因,关于ASP)使用_SVN的选项。目录列表应该如下所示

.SVN    // Metadata for rep1
_SVN    // Metadata for rep2
script1 // in rep1
script2 // in rep2
...

当然,您需要隐藏或忽略每个VCS中的外部脚本或文件夹......

添加了: 这只占一个文件夹中的两个脚本,每个脚本需要一个额外的VCS,所以如果你甚至考虑这个路径并需要更多的存储库,重命名每个Metadir并使用脚本在更新之前将其重命名:

MOVE .SVN-script1 .SVN
svn update
MOVE .SVN .SVN-script1

答案 1 :(得分:1)

为什么不简单地为每个(一组)脚本创建一个单独的分支(在git意义上)?

您可以根据需要单独开发它们。切换到分支将仅显示该分支的脚本。它有点像目录,但由版本控制系统管理。如果您以后想要将分支机构插入另一个存储库,则可以执行此操作,如果要将两个脚本组合到一个项目中,也可以执行此操作。将它们复制到不同的机器点可能是一个问题,但您可以克隆您感兴趣的分支,它应该适合您。

答案 2 :(得分:1)

我自己考虑的另一个主张是"Using Convert to Decompose Your Repository" article on hgtip.com。它作为“独立”解决方案失败,但作为“mv .hgN .hg / MOVE .SVN-script1 .SVN”想法的补充可能会有所帮助。

答案 3 :(得分:1)

您可以为要激活的任何一个创建多个隐藏的存储库目录和符号链接.hg。因此,如果您有两个存储库,请为它们创建目录:

.hg_production
.hg_staging

然后激活它们中的任何一个:

ln -sf .hg_production .hg

您可以轻松创建一个bash命令来执行此操作。因此,您可以编写类似activate-repo production的内容,它会运行ln -sf .hg_production .hg

注意:Mac似乎不支持ln -sf,所以您需要这样做:

rm .hg; ln -s .hg_production .hg

答案 4 :(得分:0)

我只能想到这两个轻量级版本系统:

1)将Dropbox与Pack-Rat升级一起使用,以保留自动备份的每个文件的完整版本历史记录,并且可以与多个Dropbox用户共享:https://www.dropbox.com/help/113

如果您有多台由同一用户(您)管理的计算机,则同步将是自动的。此外,如果机器在同一个局域网中,Dropbox足够聪明,可以通过本地网络同步文件,因此不必担心大文件。

2)为Mac OS X Lion使用“版本”识别文本编辑器。当Lion发布时,我希望更新TextMate,Coda和其他流行的Mac代码编辑器以支持此功能。

答案 5 :(得分:0)

  

UPDATE(2016):显然,一位名叫Cosmin Apreutesei的人创建了一个名为 multigit 的工具,它似乎在这个问题中实现了我所希望的!如果你读过它,非常感谢Cosmin!我今年开始使用你的工具并发现它 awesome


我开始考虑某种覆盖Mercurial / git / ...这会保留一对“禁用”存储库元目录,让我们说:

.hg1/
.hg2/
.hg3/

等,然后在hg commit FILENAME上找到与.hgN相关联的特定FILENAME,然后暂时:

mv .hgN .hg
hg commit FILENAME
mv .hg .hgN

主要的缺点是需要花一些时间来编写工具。或者有人知道这样的现成品吗?如果你这样做,请发表全功能答案(不是评论),我非常愿意接受。

答案 6 :(得分:0)

1和2之间的折衷怎么样?你可以将它们捆绑到松散相关的组中,而不是每个脚本的文件夹+ repo,例如“数据库”,“备份”等,然后为每个组创建一个文件夹+ repo吗?然后,如果您在另一台计算机上克隆一个repo,那么您只会删除少量不相关的文件。 (带宽/驱动器空间真的是一个问题吗?)对我来说,这听起来比目前为止所有其他建议更简单。

(从技术上讲,这种方法符合您的要求,因为(1)每个脚本都不在自己的目录中,(2)并非所有脚本都在同一个存储库中,(3)您可以轻松地对任何流行的DVCS执行此操作。 :d)