【问题标题】:Push secret changesets推送秘密变更集
【发布时间】:2012-04-05 13:40:34
【问题描述】:

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

我与一些分支并行工作,有时我想推送一个,而不是其他的。为了实现这一点,我在不同的克隆中工作,但我讨厌这样。

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

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

【问题讨论】:

  • 如果这样做的主要目的是执行备份,我认为推送或使用其他 HG 命令不是最好的方法。相反,您应该将整个存储库克隆复制到备份目标。
  • @DaveInCaz 为可能的几个本地变更集备份整个 repo,而主 repo 可能已经有一个备份策略似乎有点多。 (虽然对于一个小回购可能是一个简单的解决方案。)
  • 如果您知道 .hg 文件夹是多余的,您可能会从 PC 的备份中排除它。最好使用 hg share (而不是 clone )来避免首先使用冗余磁盘。但最重要的是要有一个可靠的备份!所以就个人而言,我不会采用本土方法,我只会备份整个内容并继续前进。

标签: mercurial mercurial-phases


【解决方案1】:

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

hg push -r REV

这将只推送 REV 及其祖先。

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

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

hg phase -fd 'outgoing(URL)'

(默认推送仓库的 URL 可以为空)。

【讨论】:

  • 将分支标记为机密的价值在于它可以防止意外发生(例如错误地省略了 -r REV)。
  • 当然,但如果他想备份他们,他们不能保密。
  • 是的,很遗憾不能强制推送一个秘密分支。
【解决方案2】:

似乎阶段仍然相对较新,并且某些工作流程(例如此)似乎尚未包含在内。截至 2013 年 3 月 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 中的阶段)。抱歉,希望我们能尽快找到更好的解决方案!

【讨论】:

  • --remotecmd 标志不适用于在服务器端运行 hg phase。它旨在告诉您的本地 Mercurial 在与 SSH 连接时应该如何在服务器端启动 Mercurial 服务器。
【解决方案3】:

最好的方法是结合使用@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”可能会有帮助。

【讨论】:

  • 您可以将“默认”设置为指向备份,并为您的真实 HG 服务器起一个不同的名称,例如“真实”。然后“hg push”将简单地推送到备份,您可以将另一个别名如“hg real-push”定义为“push -r .real”。因此,您永远不会意外地将任何事情推向现实。
【解决方案4】:

这是迄今为止我想出的最好的。我认为它基本上等同于您希望 push/pull 能够做的事情。

  1. 将您要传输的所有秘密变更集标记为草稿
  2. 在源代码库中运行hg bundle -r last_draft_rev bundlefile.hg path\to\backup\repo
  3. 在目标仓库中运行hg unbundle bundlefile.hg
  4. 变更集将作为草稿进入备份
  5. 将第一个草稿变更集标记为秘密,其所有后代都将被标记为秘密

如果变更集仍被标记为机密,我无法让 #2 工作。

【讨论】:

    【解决方案5】:
    @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
    

    【讨论】:

      【解决方案6】:

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

      [phases]
      publish = False
      

      请参阅Mercurial's Wiki 了解更多信息。

      【讨论】:

      • 这只是答案的一半。第一个问题是如何取出秘密变更集...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2016-05-22
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 2020-11-03
      相关资源
      最近更新 更多