12

それは逆説的に見えるかもしれません、私は秘密のチェンジセットがプライベートであることを意図していることを知っています、しかし私がそれらの秘密のチェンジセットをバックアップしたい場合はどうなりますか?

私はいくつかのブランチを並行して使用しており、1つをプッシュしたいが、他のブランチはプッシュしたくない場合があります。それを達成するために、私は別々のクローンで作業しますが、それは嫌いです。

これでMercurialにフェーズができたので、秘密のブランチを作成して、すべてを同じリポジトリに入れることができます。問題は、シークレットブランチの開始から公開までの間に、それらのシークレットチェンジセットをバックアップしたいということです(ローカルリポジトリまたはマシンで何かが発生した場合に備えて、バックアップを保持するためだけに別のマシンにクローンがあります)。

それを行う方法はありますか、それとも私のワークフローは完全に間違っていますか?

4

6 に答える 6

5

何も秘密にする必要はありません。1つのブランチのみをプッシュする場合は、次を使用します。

hg push -r REV

これにより、REVとその祖先のみがプッシュされます。

シークレットは、Mercurialパッチキューのリビジョンに適しています。これらはとにかくプッシュできず、ローカルクローンがそれらをコピーするのを防ぐためです。

ドラフトは、プッシュされていない変更を追跡するのに適しています。それでもバックアップしたい場合は、プッシュするとパブリックに切り替えられますが、次の方法で(別のリポジトリと比較して)ドラフトにリセットできます。

hg phase -fd 'outgoing(URL)'

(デフォルトのプッシュリポジトリではURLを空白にすることができます)。

于 2012-04-06T05:31:46.253 に答える
3

フェーズはまだ比較的新しいようで、このような一部のワークフローはまだ含まれていないようです。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%

これはあなたがプッシュしているリポジトリの秘密へのコミットを変更しません、私はこれを行うためにプッシュを変更しようとしました(しかし失敗しました):

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

コミットが機能するには正確に一致する必要がありremote hg commandますが、とにかくリモートリポジトリでコミットを変更することはできませんでした。

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

TortoiseHG WorkbenchのようなGUIを使用する場合は、現時点でこれをすべて手動で行う必要があります(必要なリポジトリのGUIでフェーズを変更します)。申し訳ありませんが、うまくいけば、すぐにもっと良い解決策を見つけることができます!

于 2013-03-19T20:38:16.187 に答える
2

最善のアプローチは、@ mischab1の回答、@ mark-tolonenの回答、およびエイリアスの組み合わせです。

mischab1の回答に従うことで、バックアップの場所にプッシュしてもフェーズが「パブリック」に変更されないようにします。

2番目のステップは、バックアップ場所をリポジトリのhgrc/pathsに追加することです。

[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」を使用せずに、現在のブランチをプッシュするコマンドも定義すると役立つ場合があります。

于 2013-06-11T14:44:28.887 に答える
0

これは私がこれまでに思いついた中で最高です。プッシュ/プルで実行できるようにすることと本質的に同等だと思います。

  1. 転送するすべての秘密のチェンジセットをドラフトとしてマークします
  2. ソースリポジトリで実行hg bundle -r last_draft_rev bundlefile.hg path\to\backup\repo
  3. 宛先リポジトリで実行hg unbundle bundlefile.hg
  4. チェンジセットはドラフトとしてバックアップに入ります
  5. 最初のドラフトチェンジセットをシークレットとしてマークすると、そのすべての子孫がこのようにマークされます

チェンジセットがまだ秘密としてマークされている場合、#2を機能させることができませんでした。

于 2017-11-17T19:33:37.900 に答える
0
@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
于 2017-12-27T18:07:24.087 に答える
-1

今日の最も簡単な方法は、hgrc構成ファイルに以下を追加して、バックアップリポジトリを非公開としてマークすることです。

[phases]
publish = False

詳細については、 MercurialのWikiを参照してください。

于 2013-03-23T00:54:45.617 に答える