在浏览另一个提交的同时处理一个提交 (Git/Mercurial)

Work on one commit while browsing another (Git/Mercurial)

假设我有一个巨大的 Git/Mercurial 存储库,其中包含 commit/changeset AB

现在假设有两组不重叠的文件,比如集合 dir1 和集合 dir2。集合dir1存在于commit/changesetA,可能存在于B,反之亦然(集合dir2存在于commit/changesetB,并且可能存在于A)。为简单起见,我们只考虑 dir1dir2 完全包含在存储库的子目录中的特殊情况。

现在假设我想在 commit/changeset A 浏览文件集 dir1,同时对文件集 [=14] 进行更改和提交=] 在 commit/changeset B.

一个明显的解决方案是克隆存储库并将两个存储库更新到不同的时间点。这在大多数情况下都很好,但是假设我的存储库非常大,克隆存储库并维护两个副本会非常低效且耗时。

另一个解决方案是 hg update/git checkoutB 并使用 hg cat/git show 查看文件在变更集中的样子 A。但是假设我希望 dir1 作为实际文件在我的驱动器上(例如,我需要 运行 一个重要的脚本来批处理 dir1A 中的文件并显示一些输出,然后我需要在 B).

进行更改

有没有办法在一个存储库中本地实现这一点?

前言

你必须知道两件事:

  • 所有文件|目录存在于存储库的所有变更集中
  • 一个存储库中只能存在一个活动点(工作目录的父目录)

部分解决方案:Mercurial

如果 RO 变更集作为静态对象集,与 repo 无关,对您来说已经足够,您可以 hg archive 将 A 变更为树

hg archive -r A -t files PATH/TO/RESULT/ROOT

并在 repo 中使用变更集 B

Lazy Badger 为您提供了一个完美的答案,您明智地选择了它,但只是为了确保您知道第二个本地克隆不会占用您想象的那么多 space在 Mercurial 中,因为 Mercurial 使用硬链接来避免占用额外的磁盘 space。这是一个例子:

hg clone http://host/really-big-repo
hg clone -r B really-big-repo copy-of-really-big-repo

如果您这样做,第一个克隆将拥有完整的历史记录和文件检出。第二个将使用硬链接指向本地克隆的完整历史记录和文件副本。因此,您仍在使用变更集 B 中的文件副本占用的 space,但您没有为回购占用任何额外的 space。

但一般来说,如果您有一个包含两个不相关项目的存储库(只是猜测),您应该将它们拆分成两个单独的存储库。