如何在mercurial中区分单个目录

时间:2010-12-11 02:33:24

标签: mercurial diff dvcs

我有两个本地mercurial回购,让我们称他们为产品和臭鼬。 Skunkworks是产品的克隆,并且最近有很多针对它的提交活动。我需要能够从目录树的一小部分打包差异,并将它们作为补丁文件拉出来。

我在磁盘上有以下布局:

c:/dev/product
c:/dev/skunkworks

我要打包的差异区域来自c:/ dev / skunkworks / buildstuff。该目录存在于产品仓库中。我不想让其他所有人接触到其他skunkworks的变化,但是需要能够分享我的新构建优势。

我尝试了许多不同的参数设置和'hg diff'命令的组合,但显然做错了。任何指针或建议将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

这可以很容易地完成,但是第一个问题表明,下次你做独立的工作(构建工作和臭鼬工作的其余部分)时你会分开处理 - 然后你可以推动使用hg推动直接对产品进行构建,同时在那里移动臭鼬工具。这种模式看起来像:

hg clone product skunkworks
cd skunkworks
... build hacking ...
hg commit
... build hacking ...
hg commit
hg update REVNUMBER # where revnumber is the last revision that exists in product
... skunkworks hacking ...
hg commit  # at this point you'll see (+1 heads)
... more skunkworks hacking ...
hg commit

此时你的skunkworks克隆将有两个头,一个用于构建工作,另一个用于skunkworks。您可以在工作时来回切换,在构建和sunkworks之间交替,同时在同一个克隆中将它们分开。如果你在skunkworks上工作时也想要构建细节,那么你可以做到:

hg update SKUNKWORKSHEAD
hg merge BUILDHEAD

将构建工作合并到skunkworks中,但构建工作仍然没有任何skunkworks作为其父项,因此您可以随时执行:

cd ../product
hg pull -r BUILDHEAD ../skunkworks

并且您只需将构建内容移动到产品中,而不会进行任何其他臭鼬工程更改。

这是做这种事情的最佳方式(技术上称为匿名分支),因为当 准备将skunkworks移动到产品中时,它将确切地知道构建更改的来源以及如何正确地将它们整合到臭鼬工作中。

哇,所有这些都说你现在要做的事情可能是:

cd skunkworks
hg diff -I buildstuff/** -r LAST_REV_IN_PRODUCT -r tip > ../applyme.patch
cd ../product
hg import --no-commit ../applyme.patch
hg commit

缺点是当你将臭鼬工程合并到产品中时,所有的构建更改都已经存在,这将使合并变得不那么自动化。

答案 1 :(得分:0)

我认为你想要的只是在臭鼬工厂hg diff buildstuff -r <rev>中运行,其中<rev>是与产品仓库匹配的最后一个版本。

下面创建了许多代表原始存储库的文件和目录:

C:\>hg init test
C:\>cd test
C:\test>echo >file1
C:\test>echo >file2
C:\test>md dir1
C:\test>md dir2
C:\test>echo >dir1\file3
C:\test>echo >dir1\file4
C:\test>echo >dir2\file5
C:\test>echo >dir2\file6
C:\test>hg ci -Am 1
adding dir1/file3
adding dir1/file4
adding dir2/file5
adding dir2/file6
adding file1
adding file2

我们将克隆并更改每个子目录中的文件:

C:\test>cd ..
C:\>hg clone test skunk
updating to branch default
6 files updated, 0 files merged, 0 files removed, 0 files unresolved

C:\>cd skunk
C:\skunk>echo >>dir1\file4
C:\skunk>echo >>dir2\file5
C:\skunk>hg st
M dir1\file4
M dir2\file5

C:\skunk>hg ci -m skunk

现在只显示dir2与前一次检查相比的差异:

C:\skunk>hg diff dir2 -r 0
diff --git a/dir2/file5 b/dir2/file5
--- a/dir2/file5
+++ b/dir2/file5
@@ -1,1 +1,2 @@
 ECHO is on.
+ECHO is on.