web-dev-qa-db-ja.com

「git Push --mirror」はリポジトリをバックアップするのに十分ですか?

私はソロ開発者で、ローカルのGitリポジトリで働いています。バックアップのために、そのリポジトリの正確なコピーを別のサーバーに送りたいです。

これで十分ですか?

git Push --mirror

Gitが「すべてが最新」であると通知する前に、このコマンドを2、3回実行できることがあるので、質問しているので、明らかに正確なミラーではありません。追跡ブランチを再プッシュしているようです...?

$ git Push --mirror
Counting objects: 42, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (30/30), done.
Writing objects: 100% (30/30), 5.09 KiB, done.
Total 30 (delta 17), reused 0 (delta 0)
To ssh://my/repo/url
   c094a10..0eedc92  mybranch -> mybranch
$ git Push --mirror
Total 0 (delta 0), reused 0 (delta 0)
To ssh://my/repo/url
   c094a10..0eedc92  Origin/mybranch -> Origin/mybranch
$ git Push --mirror
Everything up-to-date

何が起きているのですか?これは良い戦略ですか?

編集:バックアップをアクセス可能な作業コピーにしたいので、git bundle.tar.bz2アーカイブのようなものを使用したくありません。バックアップサーバーはネットに接続されており、常にオンになっているため、これは外出中にリポジトリにアクセスするのに便利な方法です。

52
Thomas

これは、リポジトリをバックアップするための完全に受け入れられる戦略だと思います。リポジトリ内のすべての参照に対して、Originリモートへのプッシュを実行する必要があります。ローカルリポジトリの完全な「ミラー」にします。

編集:質問であなたの更新された説明を見ました。 gitがリモートrefを他のすべてとともにリモート自体にプッシュしているようです。プッシュが完了すると、リモートrefが更新され、プッシュされたことが反映されます。これは、リモートリポジトリでは古くなっているため、さらにプッシュする必要があります。これで満足できない場合。このリモート参照を削除するには

git Push:Origin/mybranch

そして使用する

git Push --all

ただし、作成した新しいブランチはプッシュされません。

8
Greg Sexton

2回目にプッシュされたものが表示されるのは、--mirrorが予想よりも少し多くプッシュされるためです。ミラーはeverythingを意味するため、ローカルブランチとは別に、リモートブランチもプッシュします。そのため、通常どおり(または--mirrorで)プッシュすると、mybranchがプッシュされ、Origin/mybranchが更新されてOriginの新しいステータスが反映されます。 --mirrorでプッシュすると、Origin/mybranchもプッシュされます。

これは、あなたが見る奇妙さをもたらし、そのリモートから引っ張ると、さらに悪い奇妙さをもたらします。 Origin/origin/mybranchなどの名前のブランチを取得します。したがって、通常は、--mirrorを1回限りのコピーに使用し、通常の使用には通常のプッシュ(おそらく--allを使用)を使用するのが最善です。

すべてのブランチとタグを常にプッシュするには、次のように.git/configを更新できます。

[remote "Origin"]
  url = ...
  fetch = ...
  Push = +refs/heads/*
  Push = +refs/tags/*

これにより、通常のプッシュはミラーに似たものになりますが、ソースに存在しないブランチや早送りでない更新のブランチは削除されません。

31
Jakob Borg

残念ながら、Pushでは正確なコピーを取得できません。あなた 隠し場所を失う

24
nschum

私がやることは:

リポジトリのセットアップ:git clone --mirror user@server:/url-to-repo.git

次に、バックアップを更新する場合:git remote updateクローンの場所から。

これは、後で追加される新しいブランチを含むすべてのブランチをバックアップしますが、削除されたブランチはクローンから削除されないことに注意してください(バックアップにとっては良いことです)。

から http://www.garron.me/en/bits/backup-git-bare-repo.html

5
fantabolous

私は通常git Push --all。 --mirrorを使用するのは、新しく作成したブランチをプッシュする必要がある場合、またはいくつかのブランチを削除して、1つずつ名前を付けたくない場合のみです。それ以外の場合、Push --all通常、必要に応じて機能します。

4
RaptorX

アンバーの答え と同じ精神で、次のことができます。

  • ローカルバックアップにプッシュ git bundleで作成
  • その一意のファイルをリモートサーバーにコピーします。
1
VonC

.gitフォルダーのコピーを圧縮して、別のサーバーに送信するだけではどうですか?

0
Amber