バックアップとして使用できるgitまたはmercurialで非表示のブランチを作成することは可能ですか?たとえば、1日の終わりに未完成の作業がありますが(構文エラーが残っている場合もあります)、残っている混乱について他の人に迷惑をかけずに、オンラインのリポジトリにバックアップしてほしいと思います。
11 に答える
デフォルトgit clone
でgit fetch/merge
は、refs/heads/* の参照のみをダウンロードします。したがって、他の場所にプッシュしたものは、他の人によってダウンロードされることはありません (明示的に要求するか、のようなことをしない限りgit clone --mirror
)。したがって、たとえば、次のことができます。
git push origin HEAD:refs/koen/my_work
現在のコミットをプッシュします。その完全な refspec を使用して、別のチェックアウトからプルすることもできます。
git pull origin refs/koen/my_work
HEAD のプッシュを自動化するには、次のようなことができます
[remote "origin"]
url = git@github.com:pieter/gitx.git
push = :
push = refs/heads/*:refs/koen/*
これにより、他の人に迷惑をかけることなく、すべてのブランチがリモートにプッシュされます。また、使い慣れたデフォルトのプッシュ動作も維持されます。不要な場合は、push = :
行を削除してください。
Gitを使用すると、リポジトリを非常に簡単にミラーリングできます。
'backup'というリモートリポジトリがあるとします。たとえば、
git remote add --mirror backup server.com:/home/koen/backup_repo.git
その後、バックアップは同じくらい簡単です
git push backup
いくつかの注意:
--mirror
リモートリポジトリを追加するときに使用しなかった場合--mirror
は、プッシュコマンドで使用します- リモートリポジトリは「ベア」リポジトリである必要があります(プッシュしているため)
- チェックアウト
git push
とgit remote
に関するヘルプ--mirror
これは、リポジトリのリモート クローンが 2 つある場合に実現できます。
stable
unstable
機能が完了するまで、不安定版 (バックアップ) にプッシュします。機能が完成したら、ブランチを安定版にプッシュします。泡立てて、すすぎ、繰り返します。
TortoiseHg の最新バージョンでは、変更を棚上げすることができます。
手短に:
保留された変更は、保留を解除するまで作業ディレクトリから物理的に削除されます。これは、保留中の変更がなくなっている間に、プロジェクトをビルドしてテストを実行できることを意味します。これは、コミットされた変更が有効かどうかをテストできるため、ビルド時に変更を選択するよりも安全です。
変更を棚上げすることは、部分的に完了した作業を削除して、行っている他の変更のデバッグを妨げないようにするのにも役立ちます。
Mercurial では、マージするときに、「未完成の作業を保存するためだけに」コミットを含むすべての変更セットをマージします。ツリーで終了させたくない場合は、コミットしないでください。
git の場合、私の知る限り、デフォルトの動作は同じで、コミット履歴を編集してそれらを削除するのも面倒です。
したがって、示唆されているように、rsync はより良いオプションのように見えます。
Git を使用すると、通常、作業ディレクトリがあることを意味する非ベアのプライベートリポジトリがあります。そこで新しいコミットを作成し、パッチを適用し、他のリポジトリからプル/フェッチします。このリポジトリは、プライベート マシンでホストされます。
次に、public repositoryを持っています。これは、作業用リポジトリがないことを意味します。作業が安定したら、プライベート リポジトリからこのパブリック リポジトリ (たとえば、 repo.or.cz、GitHub、またはGitoriousなどの git ホスティング サイトのいずれかにホストされている可能性があります) にプッシュします。プライベート開発リポジトリからこの公開公開リポジトリにブランチのサブセットのみをプッシュできます (たとえば、Git メンテナーである Junio C Hamano は、フィーチャー ブランチをパブリックリポジトリにプッシュしません)。この公開リポジトリは、他の人がフェッチする場所です。git.git
この分離には、パブリック リポジトリにプッシュされていないコミット (たとえば、"git commit --amend" を使用) を修正したり、プライベート開発リポジトリにのみ存在する履歴の一部を書き換えたりできるという利点があります。
これは、リポジトリがどのように表示されるか、およびどのような権限を持っているかに大きく依存すると思います。原則として、ハブリポジトリにプッシュする「保存領域」として使用する一時ブランチが必要なだけです---あなたはすでにそれを知っていると思います。ブランチに「見えない」というフラグを立てる一般的な方法はありますか? 私はそうは思いませんが、ローカルのヘッド参照を反対側の奇妙な名前の参照にプッシュして実験することはできます。
git push central refs/heads/master:refs/remotes/tmp/master
これは「refs/remotes/tmp/master」を作成しようとします。これは有効な refname ですが、通常はブランチと見なされるものではありません。たとえば、gitweb は、refs/heads/ の下のブランチの 1 つの履歴に表示される場合、そのような ref を表示しますが、すべてのリモート ref のリストは表示しません。
または、弾丸を噛んで、「probably-broken-use-at-your-peril」と呼ばれる目に見えるブランチにプッシュします;)
それは実際には SCM の目的ではありません。サーバーにアップロードするためのrsyncのようなものは、より良い考えでしょうか?
私たちの Mercurial プロジェクトでは、複数のブランチを使用しています。デフォルトのブランチは「トランク」のようなものです。機能を開始するたびに、分岐してそこで開発します。コミット、プッシュ、別の場所に移動、プル、コミット、プッシュ。デフォルトのブランチは変更されず、他の誰もが私のブランチに興味を持ちません。完了したら、ブランチをデフォルトにマージします。