Нажмите секретные наборы изменений
Это может показаться парадоксальным, я знаю, что секретные наборы изменений должны быть частными, но что если я захочу сделать резервную копию этих секретных наборов изменений?
Я работаю с некоторыми ветвями параллельно, и иногда я хочу нажать одну, но не другие. Чтобы добиться этого, я работаю в отдельных клонах, но я ненавижу это.
Так что теперь у 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
Это лучшее, что я придумал до сих пор. Я думаю, что это по сути эквивалентно тому, что вы хотите, чтобы пуш-пул мог делать.
- Отметьте все секретные наборы изменений, которые вы хотите передать как черновик
- В исходном репо запустить
hg bundle -r last_draft_rev bundlefile.hg path\to\backup\repo
- В целевой репо запустить
hg unbundle bundlefile.hg
- Наборы изменений войдут в резервную копию как ПРОЕКТ
- Пометить первый черновик ревизии как секретный, и все его потомки будут помечены таким образом
Я не мог заставить № 2 работать, если наборы изменений все еще были отмечены как секретные.
В настоящее время проще всего пометить свой резервный репозиторий как непубликуемый, добавив следующее в его конфигурационный файл hgrc.
[phases]
publish = False
Смотрите Mercurial's Wiki для получения дополнительной информации.