web-dev-qa-db-ja.com

Git clone --mirrorとgit clone --bareの違いは何ですか

Git cloneのヘルプページには、--mirrorについての記述があります。

リモートリポジトリのミラーを設定します。これは--bareを意味します。

しかし、--mirrorクローンが--bareクローンとどう違うのかについては詳しく説明しません。

408
Sam

違いは、--mirrorを使用すると、allrefがそのままコピーされるas-isことです。これは、リモートトラッキングブランチ、メモ、refs/originals/*(フィルターブランチからのバックアップ)のすべてを意味します。複製されたレポにはすべてがあります。また、リモートアップデートがOriginからすべてを再取得するように設定されています(コピーされたrefを上書きします)。実際には、リポジトリをミラーリングし、完全なコピーを作成して、たとえば複数の場所で中央リポジトリをホストしたり、バックアップしたりできるようにします。はるかにエレガントなgitの方法を除き、レポジトリをまっすぐにコピーすることを考えてください。

新しい documentation は、このすべてをほとんど言っています:

--mirror

ソースリポジトリのミラーをセットアップします。これは--bareを意味します。 --bareと比較して、--mirrorは、ソースのローカルブランチをターゲットのローカルブランチにマップするだけでなく、すべてのref(リモートブランチ、メモなどを含む)をマップし、すべてがこれらの参照は、ターゲットリポジトリのgit remote updateによって上書きされます。

私の元の答えは、裸のクローンと通常の(裸でない)クローンの違いにも言及しました-裸のクローンはリモート追跡ブランチをセットアップし、HEADのローカルブランチのみを作成し、裸のクローンは直接分岐します。

Originにはいくつかのブランチ(master (HEAD)nextpu、およびmaint)、いくつかのタグ(v1v2v3)、一部のリモートブランチ(devA/masterdevB/master)、およびその他の参照(refs/foo/barrefs/foo/baz。メモ、隠し場所、他の開発者の名前空間である場合があります) 、 知るか)。

  • git clone Origin-url(非裸):すべてのタグがコピーされ、ローカルブランチmaster (HEAD)がリモートブランチを追跡しますOrigin/master、およびリモートブランチOrigin/nextOrigin/pu、およびOrigin/maint。追跡ブランチは、git fetch Originなどの操作を行うと、期待どおりに取得されるように設定されています。リモートブランチ(クローンリモート)およびその他の参照は完全に無視されます。

  • git clone --bare Origin-urlすべてのタグがコピーされ、ローカルブランチmaster (HEAD)nextpu、およびmaint、リモートトラッキングブランチなし。つまり、すべてのブランチはそのままコピーされ、完全に独立してセットアップされ、再度フェッチされることはありません。リモートブランチ(クローンリモート)およびその他の参照は完全に無視されます。

  • git clone --mirror Origin-urlこれらの参照の最後の1つがそのままコピーされます。すべてのタグ、ローカルブランチmaster (HEAD)nextpu、およびmaint、リモートブランチdevA/masterおよびdevB/master、その他を取得します参照refs/foo/barおよびrefs/foo/baz。すべてがクローン化されたリモートの場合とまったく同じです。リモートトラッキングは、git remote updateを実行すると、ミラーを削除して再クローンしたかのように、すべての参照がOriginから上書きされるように設定されています。ドキュメントが最初に言ったように、それはミラーです。機能的には同一のコピーで、オリジナルと交換可能であると想定されています。

507
Cascabel
$ 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設定をセットアップしますターゲットリポジトリ.

47
hfs

今日の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
23

GitHubドキュメンテーションの リポジトリの複製 からの微妙な説明。

ベアクローンと同様に、ミラークローンにはすべてのリモートブランチとタグが含まれますが、ローカル参照はすべてフェッチするたびに上書きされるため、常に元のリポジトリと同じになります。

12
Feckmore

クローンはリモートからの参照をコピーし、それらを「これらはリモートが持つ参照です」という名前のサブディレクトリに詰め込みます。

ミラーはリモートからの参照をコピーしてそれをそれ自身のトップレベルに入れます - それはそれ自身の参照をリモートのものに置き換えます。

これは、誰かがあなたのミラーから引っ張り出してミラーの参照をあなたのサブディレクトリに詰め込むとき、それらはオリジナルと同じ参照を得ることを意味します。最新のミラーから取得した結果は、最初のリポジトリから直接取得した場合と同じです。

12
PaulMurrayCbr

私は写真を追加して、ミラーとベアのconfigdifferenceを表示します。 enter image description here 左は裸、右は鏡です。ミラーの設定ファイルにはfetchキーがあります。つまり、git remote updateまたはgit fetch --allで更新できます。

12
yanzi1225627
$ git clone --bare https://github.com/example

このコマンドは新しいものを$ GIT_DIRにします。また、リモートのブランチヘッドは、マッピングなしで対応するローカルブランチヘッドに直接コピーされます。このオプションを使用すると、リモートトラッキングブランチも関連設定変数も作成されません。

$ git clone --mirror https://github.com/example

ベアクローンと同様に、ミラークローンにはすべてのリモートブランチとタグが含まれますが、すべてのローカル参照(リモートトラッキングブランチ、メモなどを含む)はフェッチするたびに上書きされるため、常に元のリポジトリと同じになります。

2
Shantanu Singh