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


486

git cloneのヘルプページには、次のように書かれてい--mirrorます。

リモートリポジトリのミラーをセットアップします。これは意味し--bareます。

ただし、--mirrorクローンとクローンの違いについては詳しく説明しません--bare


3
便利ですが、このミラーをgithubなどのリモートリポジトリにプッシュする場合も、このリンクが便利です。
ジョーズで2014

回答:


569

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

新しいドキュメンテーションはほとんどこれをすべて言っています:

--mirror

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

私の元の回答では、ベアクローンと通常の(非ベア)クローンの違いも指摘しました。非ベアクローンはリモートトラッキングブランチをセットアップし、のローカルブランチのみを作成HEADしますが、ベアクローンはブランチを直接コピーします。

仮定原点は(いくつかの支店を持っているmaster (HEAD)nextpu、およびmaint)、いくつかのタグ(v1v2v3)、いくつかのリモートブランチ(devA/masterdevB/master)、および(他のいくつかの参照文献refs/foo/barrefs/foo/baz知っているノート、スタッシュ、他の開発者の名前空間、かもしれません)。

  • git clone origin-url(非裸):あなたがコピーされたタグのすべてを取得する、ローカルブランチは、master (HEAD)リモートブランチを追跡origin/masterし、リモートブランチorigin/nextorigin/puorigin/maint。追跡ブランチはgit fetch origin、のようなことをした場合に、期待どおりにフェッチされるように設定されています。リモートブランチ(クローンリモート内)とその他の参照は完全に無視されます。

  • git clone --bare origin-urlあなたは、コピーされたすべてのタグ、支店でしょうmaster (HEAD)nextpu、とmaint、ないリモート追跡ブランチを。つまり、すべてのブランチがそのままコピーされ、完全に独立してセットアップされ、再度フェッチすることは期待されません。リモートブランチ(クローンリモート内)とその他の参照は完全に無視されます。

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


「通常のクローン」とは、-bareまたは--mirrorフラグのないクローンを指しますか?
サム

1
ええ、そうです。マンページで述べているように、ベアクローンでは、ブランチも直接コピーされます(refs / remotes / origin、追跡なし)。編集
カスカベル

git-internalの違いだけでなく、違いについての使用例をさらに追加できますか?
cmcginty 2010年

@ケーシーはあなたが探していたものですか?私が最初に書いたものが「内部」であるとはまったく思いませんでした-タグとブランチは非常に磁器の特徴です。
Cascabel、

「そのままコピーされたブランチ」とは、ブランチがクローンの同じ相対パスにコピーされることを意味しますか?それとも、ブランチが何らかの形で変換されることを意味しますか?
サム

56
$ 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構成を設定します。


4
私はあなたgit fetchがそれを実際に同一にするためにそれを続ける必要があると信じています。とにかく、これは一種の非回答です-問題の要点は「ミラーのリモート/クローンは通常のものとどう違うのですか?」です。
Cascabel

6
私は実際にこの違いを示す方法が好きです。うまくいけば、それは正確です!hfsがfetchコマンドを追加することを望みます。
joeytwiddle

たとえば、$(basename $ URL)が何に変換されるかなど、明確ではありません
Kzqai

5
basenameパスのディレクトリ部分を取り除く通常のUNIXユーティリティであり、$()単にbashのコマンド置換です。
ビクターザマニアン2013

6
これはまだその--mirror中にあります。これは、それが何をするのかを説明している場合にのみ、受け入れられる答えになりますgit remote add --mirror
Zenexer 2014年

24

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

14

リポジトリの複製に関するGitHubドキュメントからの微妙な説明:

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


1
ありがとうございました; これにより、ミラー化されたクローンを使用すると、ローカルタグとブランチが上書きされることがわかりました。非常に役立ちます。
ワイルドカード2015

2
--prunegit fetchの実行時に使用して、リモートに存在しないローカル参照を削除することもできます。
nishanths 2017年

13

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

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

これは、誰かがあなたのミラーからプルして、ミラーのリファレンスをサブディレクトリに詰め込むと、オリジナルのものと同じリファレンスを取得することを意味します。最新のミラーからフェッチした結果は、最初のリポジトリから直接フェッチした場合と同じです。


12

画像を追加し、configミラーとベアの違いを示します。 ここに画像の説明を入力してください 左は裸、右は鏡です。あなたは、ミラーのconfigファイルを持って、明確にすることができfetch、あなたはそれを更新することができることを意味し、キーをすることによってgit remote updateか、git fetch --all


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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.