记录系统是一个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的文档现在应用补丁的线索,但我还没有找到解决方案。
答案 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提交(您可以通过这种方式轻松验证所有更改)。
话虽如此,我会接受之前的答案,因为它可能是正确的方法。