如何在Mercurial中对两个任意修订进行区分,以便将diff应用于SVN工作副本?

时间:2010-08-05 22:07:21

标签: svn mercurial

记录系统是一个SVN存储库,但无论出于何种原因,我已将存储库拉入Mercurial。我不想使用hgsubversion扩展,因为它不建议创建额外的克隆和分支等等。

我希望能够在Mercurial中进行自己的开发,但我希望然后在我喜欢的时候对我的SVN工作副本应用一个巨大的补丁(或小补丁)。

所以我有:

/dev/repos/hg/project/master
/dev/repos/hg/project/master-feature-foo
...

在Mercurial方面和SVN方面,我有:

/dev/repos/svn/project

我希望能够使用我的mercurial工作副本的内容覆盖我的SVN工作副本/ dev / repos / svn / project,例如/ dev / repos / hg / project / master-feature-foo。 / p>

哪个Mercurial和SVN命令有助于此?我正在查看关于hg diff,hg export和TortoiseSVN的文档现在应用补丁的线索,但我还没有找到解决方案。

2 个答案:

答案 0 :(得分:2)

您可以通过多种方式将提示转移到您的svn目录:

hg diff&补丁:

cd /svn/working/copy
hg -R /hg/working/copy -r svn.15500:tip | patch -p1`

复制已更改的文件

#!/bin/bash
REV=$1
HG=/hg/working/copy

cd /svn/working/copy

# copy changed files, tar is used instead of cp to preserve file paths
hg -R $HG st --rev $REV:tip -man0 | xargs -0 tar -cC $HG | tar x

# add new files, cuses warnings if there are no new files
hg -R $HG st --rev $REV:tip -an0 | xargs -0 svn add

# remove deleted files, will cause warnings if there are no deleted files
hg -R $HG st --rev $REV:tip -rn0 | xargs svn rm

另一种方法是使用tortoisehg,其中可以使用rebase扩展克隆。这将是以下工作流程:

hgimportsvn http://svn.server/repo/trunk
cd trunk
hgpullsvn
cd ..
hg clone trunk work
cd work
#Hack Hack Hack

cd ../trunk
hgpullsvn
# if there are new revisions rebase ../work before pull
hg pull ../work
hgpushsvn

#rebase
cd work
hg pull --rebase

答案 1 :(得分:0)

我最终做的事情相当蹩脚(我认为)。我的目标是获取我的Mercurial存储库的内容并用它们覆盖我的SVN工作副本(所以我可以稍后将它们提交给SVN)。我并不真正关心Mercurial更改的详细历史记录 - 提交将在SVN回购中“汇总”。

非工作方法,A1:删除SVN工作副本内容,然后复制Mercurial工作副本。

无法正常工作,因为... .svn文件夹会被破坏。

工作方法,A2:使用find命令从SVN工作副本中删除除.svn文件夹之外的所有文件夹。然后只需复制Mercurial工作副本。 SVN将检测更改并允许我提交。

方法A2的问题:  这是手册。  2.如果任何目录为空,Mercurial将不会跟踪那些,但它们将在SVN存储库中(我没有遇到此问题,但可能会发生)。  3.在SVN方面失去Mercurial历史。由于SVN元数据不像Mercurial那样丰富,因此您无法做到这一点。  4.只有当一个开发人员提交SVN回购时才有用。如果有多个开发人员提交,那么您必须同步所有更改,包括将所有更改与所有克隆同步。

方法A2的优点:

1)这很容易。

在svn工作副本根目录中,运行以下命令:

# delete all files in an SVN working copy, except those
# in the .svn folders; directories are not deleted
find . -path "*.svn" -prune -o -type f -exec rm -v {} +

使用文件管理器将Mercurial工作副本内容拖到SVN工作副本中(您可以使用脚本)。

使用TortoiseSVN提交(您可以通过这种方式轻松验证所有更改)。

话虽如此,我会接受之前的答案,因为它可能是正确的方法。