Help us understand the problem. What is going on with this article?

Git の mirror 関連のオプションや設定

More than 5 years have passed since last update.

git clone --mirror $URL

  1. bare リポジトリが作られる
    • git init --bare と大体同じ
  2. --mirror オプション付きでリモートリポジトリが追加される
    • git remote add --mirror origin $URL と大体同じ
  3. リモートリポジトリが fetch される
    • git fetch origin と大体同じ

git push --mirror $NAME

  • ローカルリポジトリの refs/ がそのままリモートリポジトリの refs/ にプッシュされる
    • git push $NAME "refs/*:refs/*" と大体同じ

git remote add --mirror=push $NAME $URL

  • config の remote.$NAME に下記が追記される

    url = $URL
    mirror = true
    

git remote add --mirror=fetch $NAME $URL

  • config の remote.$NAME に下記が追記される

    url = $URL
    fetch = +refs/*:refs/*
    

git remote add --mirror $NAME $URL

  • --mirror=push と --mirror=fetch の両方
    • ただし使うなと警告が表示される

config の mirror = true の効果

  • git push で自動的に --mirror オプションが指定されたように振る舞う

config の fetch = +refs/*:refs/* の効果

  • git fetch でリモートリポジトリの refs/ がローカルリポジトリの refs/ にそのまま保存される
    • 通常はリモートリポジトリの refs/heads/ がローカルリポジトリの refs/remotes/*/ に保存される
    • つまり リモート追跡ブランチ=追跡ブランチ=ローカルブランチ となる

まとめ

リモートをローカルにミラー

git clone --mirror $URL

または

git init --bare
git remote add --mirror=fetch origin $URL
git fetch origin

ローカルをリモートにミラー

git remote add --mirror=push origin $URL
git push origin

ローカルをリモートにミラーのダメな例

git remote add origin $URL
git push --mirror origin

この手順だと git remote add origin $URL で config に fetch = +refs/heads/*:refs/remotes/origin/* が追記されます。

そのため、git push でリモートリポジトリを更新した後にローカルリポジトリにリモート追跡ブランチが作成されます。

push の --mirror オプションは refs/ をすべてプッシュするため、もう一度 git push するとリモート追跡ブランチまで一緒にリモートリポジトリにプッシュされます。
(ローカルリポジトリ・リモートリポジトリ共に refs/remotes/origin/master のようなブランチが作成される)

リモートAをローカルを経由してリモートBにミラー

git clone --mirror git@example.com:repo.git
cd repo.git
git remote add --mirror=push new git@example.net:repo.git
git push new

さいごに

git push の --mirror オプションの存在意義がわからない。

おまけ

リモートAをローカルを経由してリモートBにミラー、ただしローカルはワーキングツリーを持つ(not bare)

git clone git@example.com:repo.git
cd repo.git
git remote set-head -d origin
git remote add new git@example.net:repo.git
git push --tags new "refs/remotes/origin/*:refs/heads/*"
ngyuki
テック系男子。 ただのやってみた系の記事ははてなブログに、それ以外の技術系のネタは Qiita に投稿します。
https://ngyuki.jp/
headjapan
中規模~大規模の安定した基幹システム・大規模サイトの分析・要件定義・設計・開発を得意とする、総合的な開発会社です。
http://www.headjapan.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした