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

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

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

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

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

6 ответов

Решение

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

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

hg push -r REV

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

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

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

hg phase -fd 'outgoing(URL)'

(URL может быть пустым для репо по умолчанию).

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

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

Вторым шагом будет добавление места резервного копирования в hgrc / path вашего репозитория:

[paths]
default = ...
backup = backup_location

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

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

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

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

@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

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

  1. Отметьте все секретные наборы изменений, которые вы хотите передать как черновик
  2. В исходном репо запустить hg bundle -r last_draft_rev bundlefile.hg path\to\backup\repo
  3. В целевой репо запустить hg unbundle bundlefile.hg
  4. Наборы изменений войдут в резервную копию как ПРОЕКТ
  5. Пометить первый черновик ревизии как секретный, и все его потомки будут помечены таким образом

Я не мог заставить № 2 работать, если наборы изменений все еще были отмечены как секретные.

В настоящее время проще всего пометить свой резервный репозиторий как непубликуемый, добавив следующее в его конфигурационный файл hgrc.

[phases]
publish = False

Смотрите Mercurial's Wiki для получения дополнительной информации.

Другие вопросы по тегам