推秘密变更集

时间:2012-04-05 13:40:35

标签: mercurial mercurial-phases

这可能看起来很矛盾,我知道秘密更改集应该是私有的,但如果我想备份这些秘密更改集会怎么样?

我与一些分支机构并行工作,有时候我想推一个,但不是其他的。为了达到这个目的,我在不同的克隆工作,但我讨厌这个。

所以现在mercurial有阶段,我可以制作秘密分支,并将所有内容放在同一个存储库中。问题是,在秘密分支的开始和它的发布之间,我想备份那些秘密变更集(我在另一台机器上有一个克隆,只是为了保存我的备份以防万一我的本地仓库或我的机器发生了事情)。

有没有办法做到这一点,或者我的工作流程是完全错误的?

6 个答案:

答案 0 :(得分:4)

无需标记任何秘密。如果您只想推送一个分支,请使用:

hg push -r REV

这将仅推动REV及其祖先。

Secret对于Mercurial补丁队列修订很有用,因为无论如何它们都无法被推送,它会阻止本地克隆复制它们。

草稿适用于跟踪未按下的更改。如果您仍想备份它们,推送它们会将它们翻转为Public,但您可以将它们重置为草稿(与另一个存储库相比):

hg phase -fd 'outgoing(URL)'

(默认推送存储库的URL可以为空白。)

答案 1 :(得分:2)

似乎阶段仍然相对较新,而且似乎还没有包括某些工作流程,例如此类工作流程。截至2013-03-19,我相信你能做到这一点的唯一方法是手动将阶段从秘密更改为公开。

您可以从命令行使用以下命令:

for /f "delims=" %a in ('hg log --template "{rev} " -r "secret()"') do @set secret=%a
hg phase -d %secret%
hg push -f
hg phase -sf %secret%

这不会改变你要推送的存储库上的秘密提交,我试图改变推送来做到这一点(但是没有成功):

hg push -f --remotecmd hg phase -sf %secret%

提交必须与remote hg command完全匹配才能正常工作,但无论如何我都无法在远程存储库上进行更改。

=============================================== =============

如果你想使用像TortoiseHG Workbench这样的GUI,你必须手动完成所有这些操作(在你想要的任何存储库中更改GUI的各个阶段)。对不起,希望我们能尽快找到更好的解决方案!

答案 2 :(得分:2)

最好的方法是@ mischab1的answer,@ mark-tolonen的answer和别名的组合。

通过关注mischab1的回答,您确保推送到备份位置不会将阶段更改为“公共”。

第二步是将备份位置添加到存储库的hgrc / paths:

[paths]
default = ...
backup = backup_location

下一步是通过全局hgrc中的别名定义备份命令,例如: “bubr”(用于备份当前分支)或“burev”(备份当前转速)。

[alias]
bubr = push -b . backup
burev = push -r . backup
然后,

hg bubrhg burev会将当前分支/修订推送到定义为“备份”路径的位置。

编辑这仍然有一个缺点,即您可能会意外地使用“hg push”推送所有更改,因此还要定义hg pubr命令以推送当前分支而不使用“hg push”默认情况下可能会有所帮助。

答案 3 :(得分:0)

这是迄今为止我提出的最好的。我认为它基本上等同于你想要的推/拉能力。

  1. 将您想要转移的所有秘密更改集标记为草稿
  2. 在源仓库中运行hg bundle -r last_draft_rev bundlefile.hg path\to\backup\repo
  3. 在目的地仓库中运行hg unbundle bundlefile.hg
  4. 更改集将作为DRAFT进入备份
  5. 将第一个变更集草案标记为机密,并将其所有后代标记为
  6. 如果更改集仍然标记为秘密,我无法使#2工作。

答案 4 :(得分:0)

@echo off
rem hgfullpull_naive.cmd
setlocal
set SRC_REPO=%~f1
set DST_REPO=%~f2
set TMP_DIR=%TEMP%\%~n0.tmp
set NODES_LIST=%TMP_DIR%\%~n0.%RANDOM%.tmp

if "%SRC_REPO%"=="" exit /b 1
if "%DST_REPO%"=="" exit /b 1
if "%SRC_REPO%"=="%DST_REPO%" exit /b 1

call :ALL
del /Q "%NODES_LIST%"
endlocal
goto :eof

:ALL
    md "%TMP_DIR%"
    hg log --rev "secret()" --template "{node}\n" --repository "%SRC_REPO%" >"%NODES_LIST%" || exit /b 1
    call :CHANGE_PHASE "%SRC_REPO%" --draft
    hg pull --repository "%DST_REPO%" "%SRC_REPO%"
    call :CHANGE_PHASE "%SRC_REPO%" --secret
    call :CHANGE_PHASE "%DST_REPO%" --secret
    goto :eof

:CHANGE_PHASE 
    setlocal
    set REPO=%~1
    set PHASE=%~2
    for /F "eol=; delims= usebackq" %%i IN ("%NODES_LIST%") DO (hg phase %PHASE% --force --rev %%i --repository "%REPO%")
    endlocal
    goto :eof

答案 5 :(得分:-1)

现在最简单的做法是将备份存储库标记为非发布,方法是将以下内容添加到其hgrc配置文件中。

[phases]
publish = False

有关详细信息,请参阅Mercurial's Wiki