我知道秘密更改集是用来保密的,那么如果我想备份这些秘密更改集呢?尽管这看起来很矛盾。
我同时处理一些分支,有时我想推送其中一个,但不想推送其他分支。为了实现这一点,我在独立的克隆中工作,但我讨厌这种方式。
现在,Mercurial有了阶段(phases),我可以创建秘密分支,并将所有内容保存在同一个存储库中。问题是,在开始秘密分支和其发布之间,我想备份这些秘密更改集(我在另一台机器上克隆了一个副本,以防我的本地仓库或计算机发生故障)。
是否有方法可以做到这一点,还是我的工作流程完全错误?
我知道秘密更改集是用来保密的,那么如果我想备份这些秘密更改集呢?尽管这看起来很矛盾。
我同时处理一些分支,有时我想推送其中一个,但不想推送其他分支。为了实现这一点,我在独立的克隆中工作,但我讨厌这种方式。
现在,Mercurial有了阶段(phases),我可以创建秘密分支,并将所有内容保存在同一个存储库中。问题是,在开始秘密分支和其发布之间,我想备份这些秘密更改集(我在另一台机器上克隆了一个副本,以防我的本地仓库或计算机发生故障)。
是否有方法可以做到这一点,还是我的工作流程完全错误?
不需要标记任何机密信息。如果你只想推送一个分支,使用以下命令:
hg push -r REV
这将仅推送REV及其祖先。
对于Mercurial补丁队列修订版本,Secret很有用,因为它们无法被推送,可以防止本地克隆复制它们。
Draft适用于跟踪未推送的更改。如果您仍然想备份它们,将它们推送会翻转它们到Public状态,但您可以使用以下命令将它们重置回草稿状态(与另一个存储库相比):
hg phase -fd 'outgoing(URL)'
看起来阶段仍然相对较新,某些工作流程(例如此类)似乎尚未包含在其中。截至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%
这不会改变你要推送到的仓库上的 secret 提交,我尝试更改推送以实现此目的(但未成功):
hg push -f --remotecmd hg phase -sf %secret%
[paths]
default = ...
backup = backup_location
[alias]
bubr = push -b . backup
burev = push -r . backup
hg bubr
或hg burev
会将当前分支/版本推送到定义为“备份”路径的位置。
编辑这仍然有一个缺点,你可能会意外地使用“hg push”推送所有更改,因此定义一个hg pubr
命令来推送当前分支并默认不使用“hg push”可能会有所帮助。
这是我迄今为止想出的最好方案。我认为它基本上等同于您想要 push/pull 能够执行的操作。
hg bundle -r last_draft_rev bundlefile.hg path\to\backup\repo
hg unbundle bundlefile.hg
如果变更集仍然标记为秘密,则我无法使步骤 #2 正常工作。
@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