回答:
違いは、を使用すると--mirror
、すべての参照がそのままコピーされることです。これはすべてを意味します:リモート追跡ブランチ、メモ、refs / originals / *(フィルターブランチからのバックアップ)。複製されたレポはそれをすべて持っています。また、リモート更新ですべてをオリジンから再フェッチするように設定されます(コピーされた参照を上書きします)。アイデアは、実際にはリポジトリをミラーリングし、完全なコピーを作成することです。これにより、たとえば、中央リポジトリを複数の場所でホストしたり、バックアップしたりできます。よりエレガントなgitの方法を除いて、リポジトリをまっすぐにコピーすることを考えてください。
新しいドキュメンテーションはほとんどこれをすべて言っています:
--mirror
ソースリポジトリのミラーをセットアップします。これは意味し
--bare
ます。と比較して--bare
、--mirror
ソースのローカルブランチをターゲットのローカルブランチにマップするだけでなく、すべてのref(リモートブランチ、ノートなどを含む)をマップし、これらすべてのrefがgit remote update
ターゲットリポジトリのによって上書きされるようにrefspec構成を設定します。
私の元の回答では、ベアクローンと通常の(非ベア)クローンの違いも指摘しました。非ベアクローンはリモートトラッキングブランチをセットアップし、のローカルブランチのみを作成HEAD
しますが、ベアクローンはブランチを直接コピーします。
仮定原点は(いくつかの支店を持っているmaster (HEAD)
、next
、pu
、およびmaint
)、いくつかのタグ(v1
、v2
、v3
)、いくつかのリモートブランチ(devA/master
、devB/master
)、および(他のいくつかの参照文献refs/foo/bar
、refs/foo/baz
知っているノート、スタッシュ、他の開発者の名前空間、かもしれません)。
git clone origin-url
(非裸):あなたがコピーされたタグのすべてを取得する、ローカルブランチは、master (HEAD)
リモートブランチを追跡origin/master
し、リモートブランチorigin/next
、origin/pu
とorigin/maint
。追跡ブランチはgit fetch origin
、のようなことをした場合に、期待どおりにフェッチされるように設定されています。リモートブランチ(クローンリモート内)とその他の参照は完全に無視されます。
git clone --bare origin-url
:あなたは、コピーされたすべてのタグ、支店でしょうmaster (HEAD)
、next
、pu
、とmaint
、ないリモート追跡ブランチを。つまり、すべてのブランチがそのままコピーされ、完全に独立してセットアップされ、再度フェッチすることは期待されません。リモートブランチ(クローンリモート内)とその他の参照は完全に無視されます。
git clone --mirror origin-url
:これらの参照の最後の1つはそのままコピーされます。あなたはすべてのタグ、支店得るでしょうmaster (HEAD)
、next
、pu
、およびmaint
、リモートブランチdevA/master
とdevB/master
、他の参考文献refs/foo/bar
とrefs/foo/baz
。すべては、クローンされたリモートの場合とまったく同じです。リモートトラッキングが設定されているので、実行git remote update
すると、ミラーを削除して再クローンしたかのように、すべての参照が元の場所から上書きされます。ドキュメントが最初に言ったように、それは鏡です。機能的には同一のコピーで、オリジナルと交換可能です。
$ git clone --mirror $URL
の略記です
$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)
(ここから直接コピー)
現在のマンページはそれをどのように置くか:
と比較して
--bare
、--mirror
ソースのローカルブランチをターゲットのローカルブランチにマップするだけでなく、すべてのref(リモートブランチ、ノートなどを含む)をマップし、これらすべてのrefがgit remote update
ターゲットリポジトリのによって上書きされるようにrefspec構成を設定します。
git fetch
がそれを実際に同一にするためにそれを続ける必要があると信じています。とにかく、これは一種の非回答です-問題の要点は「ミラーのリモート/クローンは通常のものとどう違うのですか?」です。
basename
パスのディレクトリ部分を取り除く通常のUNIXユーティリティであり、$()
単にbashのコマンド置換です。
--mirror
中にあります。これは、それが何をするのかを説明している場合にのみ、受け入れられる答えになりますgit remote add --mirror
。
今日のgit-2.0.0でのテストは、-mirrorオプションがフック、設定ファイル、説明ファイル、info / excludeファイルをコピーせず、少なくとも私のテストケースではいくつかの参照をコピーしないことを示しています(これは私が行いません) tは理解します。)私はそれを「オリジナルと交換可能な機能的に同一のコピー」とは呼びません。
-bash-3.2$ git --version
git version 2.0.0
-bash-3.2$ git clone --mirror /git/hooks
Cloning into bare repository 'hooks.git'...
done.
-bash-3.2$ diff --brief -r /git/hooks.git hooks.git
Files /git/hooks.git/config and hooks.git/config differ
Files /git/hooks.git/description and hooks.git/description differ
...
Only in hooks.git/hooks: applypatch-msg.sample
...
Only in /git/hooks.git/hooks: post-receive
...
Files /git/hooks.git/info/exclude and hooks.git/info/exclude differ
...
Files /git/hooks.git/packed-refs and hooks.git/packed-refs differ
Only in /git/hooks.git/refs/heads: fake_branch
Only in /git/hooks.git/refs/heads: master
Only in /git/hooks.git/refs: meta
リポジトリの複製に関するGitHubドキュメントからの微妙な説明:
ベアクローンと同様に、ミラークローンにはすべてのリモートブランチとタグが含まれますが、フェッチするたびにすべてのローカル参照が上書きされるため、常に元のリポジトリと同じになります。
--prune
git fetchの実行時に使用して、リモートに存在しないローカル参照を削除することもできます。
$ git clone --bare https://github.com/example
このコマンドは、新しいもの自体を$ GIT_DIRにします。また、リモートのブランチヘッドは、マッピングせずに、対応するローカルブランチヘッドに直接コピーされます。このオプションを使用すると、リモート追跡ブランチも関連する構成変数も作成されません。
$ git clone --mirror https://github.com/example
ベアクローンと同様に、ミラークローンにはすべてのリモートブランチとタグが含まれますが、フェッチするたびにすべてのローカル参照(リモート追跡ブランチ、ノートなどを含む)が上書きされるため、常に元のリポジトリと同じになります。