Git cloneのヘルプページには、--mirror
についての記述があります。
リモートリポジトリのミラーを設定します。これは
--bare
を意味します。
しかし、--mirror
クローンが--bare
クローンとどう違うのかについては詳しく説明しません。
違いは、--mirror
を使用すると、allrefがそのままコピーされるas-isことです。これは、リモートトラッキングブランチ、メモ、refs/originals/*(フィルターブランチからのバックアップ)のすべてを意味します。複製されたレポにはすべてがあります。また、リモートアップデートがOriginからすべてを再取得するように設定されています(コピーされたrefを上書きします)。実際には、リポジトリをミラーリングし、完全なコピーを作成して、たとえば複数の場所で中央リポジトリをホストしたり、バックアップしたりできるようにします。はるかにエレガントなgitの方法を除き、レポジトリをまっすぐにコピーすることを考えてください。
新しい documentation は、このすべてをほとんど言っています:
--mirror
ソースリポジトリのミラーをセットアップします。これは
--bare
を意味します。--bare
と比較して、--mirror
は、ソースのローカルブランチをターゲットのローカルブランチにマップするだけでなく、すべてのref(リモートブランチ、メモなどを含む)をマップし、すべてがこれらの参照は、ターゲットリポジトリのgit remote update
によって上書きされます。
私の元の答えは、裸のクローンと通常の(裸でない)クローンの違いにも言及しました-裸のクローンはリモート追跡ブランチをセットアップし、HEAD
のローカルブランチのみを作成し、裸のクローンは直接分岐します。
Originにはいくつかのブランチ(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
を実行すると、ミラーを削除して再クローンしたかのように、すべての参照がOriginから上書きされるように設定されています。ドキュメントが最初に言ったように、それはミラーです。機能的には同一のコピーで、オリジナルと交換可能であると想定されています。
$ git clone --mirror $URL
の省略形です
$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch Origin $URL)
( here から直接コピー)
現在のmanページがどのように書いているか:
--bare
と比較すると、--mirror
はソースのローカルブランチをターゲットのローカルブランチにマッピングするだけでなく、すべてのref(リモートブランチ、ノートなどを含む)をマッピングし、これらのすべてのrefがgit remote update
によって上書きされるようにrefspec設定をセットアップしますターゲットリポジトリ.
今日のgit-2.0.0でのテストは、 - mirrorオプションがフック、configファイル、descriptionファイル、info/excludeファイル、そして少なくとも私のテストケースではいくつかの参照をコピーしないことを示しています。私はそれを「元のものと交換可能な、機能的に同一のコピー」とは言いません。
-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ドキュメンテーションの リポジトリの複製 からの微妙な説明。
ベアクローンと同様に、ミラークローンにはすべてのリモートブランチとタグが含まれますが、ローカル参照はすべてフェッチするたびに上書きされるため、常に元のリポジトリと同じになります。
クローンはリモートからの参照をコピーし、それらを「これらはリモートが持つ参照です」という名前のサブディレクトリに詰め込みます。
ミラーはリモートからの参照をコピーしてそれをそれ自身のトップレベルに入れます - それはそれ自身の参照をリモートのものに置き換えます。
これは、誰かがあなたのミラーから引っ張り出してミラーの参照をあなたのサブディレクトリに詰め込むとき、それらはオリジナルと同じ参照を得ることを意味します。最新のミラーから取得した結果は、最初のリポジトリから直接取得した場合と同じです。
$ git clone --bare https://github.com/example
このコマンドは新しいものを$ GIT_DIRにします。また、リモートのブランチヘッドは、マッピングなしで対応するローカルブランチヘッドに直接コピーされます。このオプションを使用すると、リモートトラッキングブランチも関連設定変数も作成されません。
$ git clone --mirror https://github.com/example
ベアクローンと同様に、ミラークローンにはすべてのリモートブランチとタグが含まれますが、すべてのローカル参照(リモートトラッキングブランチ、メモなどを含む)はフェッチするたびに上書きされるため、常に元のリポジトリと同じになります。