Нажимайте секретные наборы изменений

Это может показаться парадоксальным, я знаю, что секретные изменения должны быть частными, но что, если я хочу сделать резервную копию этих секретных наборов изменений?

Я работаю с некоторыми ветвями параллельно, а иногда хочу подталкивать один, но не другие. Для этого я работаю в отдельных клонах, но я ненавижу это.

Итак, теперь у меркуриального есть фазы, я могу создавать секретные ветки и иметь все в одном хранилище. Проблема в том, что между началом секретной ветки и ее публикацией я хочу сделать резервную копию этих секретных наборов изменений (у меня есть клон на другой машине, чтобы хранить мои резервные копии, если что-то происходит с моим местным репо или моей машиной).

Есть ли способ сделать это, или мой рабочий процесс не соответствует действительности?

Ответ 1

Похоже, что фазы все еще относительно новы, и некоторые рабочие процессы, такие как это, похоже, пока не включены. По состоянию на 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%

Это не изменяет коммит в секретный репозиторий, на который вы нажимаете, я пытался изменить push для этого (но не увенчался успехом):

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

Коммиты должны были бы точно соответствовать работе remote hg command, но я все равно не мог ее изменить в удаленном репозитории.

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

Если вы хотите использовать графический интерфейс, такой как TortoiseHG Workbench, вам нужно будет сделать все это вручную (измените фазы в графическом интерфейсе в любых репозиториях, которые вы хотите) на данный момент. Извините, и, надеюсь, мы сможем найти лучшее решение, скоро!

Ответ 2

Не нужно ничего скрывать. Если вы хотите только нажать одну ветвь, используйте:

hg push -r REV

Это приведет только к REV и его предкам.

Секрет хорош для пересмотров очередей Mercurial, поскольку они не могут быть нажаты в любом случае, и это мешает локальному клону копировать их.

Черновик хорош для отслеживания непроверенных изменений. Если вы все еще хотите их скопировать, нажатие на них перевернет их в Public, но вы можете reset вернуть их в черновик (по сравнению с другим репозиторием) с помощью

hg phase -fd 'outgoing(URL)'

(URL-адрес может быть пустым для стандартного push-репо).

Ответ 3

Лучший подход - это сочетание @mischab1 answer, @mark-tolonen answer и псевдонимы.

Следуя запросу mischab1, вы убедитесь, что нажатие на резервное копирование не изменит фазу на "общедоступный".

Второй шаг должен заключаться в том, чтобы добавить место резервного копирования в hgrc/paths вашего репозитория:

[paths]
default = ...
backup = backup_location

Следующий шаг - определить команду резервного копирования через псевдоним в глобальном hgrc, например. "bubr" (для резервной текущей ветки) или "burev" (резервный ток rev).

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

hg bubr или hg burev будет затем нажимать текущую ветку/ревизию на место, определенное как путь к резервной копии.

Изменить. У этого есть недостаток, который вы могли случайно нажать на все изменения с помощью "hg push", чтобы определить также команду hg pubr, чтобы нажимать текущую ветку и не использовать "hg push" по умолчанию может быть полезно.

Ответ 4

Это лучшее, что я придумал до сих пор. Я думаю, что он по существу эквивалентен тому, что вы хотите сделать нажатием/тягой, чтобы иметь возможность делать.

  • Отметьте все секретные изменения, которые вы хотите перенести как черновик
  • В исходном режиме репо hg bundle -r last_draft_rev bundlefile.hg path\to\backup\repo
  • В репозитории назначения hg unbundle bundlefile.hg
  • Изменения внесены в резервную копию как DRAFT
  • Отметьте первый черновик изменений как секретный, и все его потомки будут отмечены таким образом

Я не мог заставить # 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 Wiki.