gitリポジトリを完全にバックアップしますか?


136

すべてのブランチとタグを含むgitリポジトリ全体をバックアップする簡単な方法はありますか?


2
ここでローカルgitリポジトリを参照していると思います。
Ztyx


3
正解は次のとおりです。git clone --mirror git@example.com/your-repo.gitこれにより、リポジトリ全体、メモ、ブランチ、追跡などがコピーされます
John

私が実行したいくつかのWeb検索では、この質問は結果に含まれていませんでした。"リポジトリのすべてをgit clone"; 「すべてのタグ付きのリポジトリをgit cloneする」。
ケニーエビット2018年

回答:


64

それのクローンを作るだけではどうですか?

git clone --mirror other/repo.git

すべてのリポジトリは、そのリモートのバックアップです。


7
@Daniel:リポジトリのクローンを作成すると、すべてのブランチがフェッチされますが、デフォルトのブランチのみがチェックアウトされます。お試しくださいgit branch -a。多分それはもっと明白な方法です:リポジトリをクローンした後、すべてのブランチをフェッチするのではなく、すべてのコミットをフェッチします。ブランチは既存のコミットのみを参照します。
KingCrunch

1
もし彼がそのような質問をすることができれば、彼はクローンコマンドをよく知っていると思います、そしてそれは彼にとって明らかに十分ではありません(それはクローンであり、ダンプではないので)。ダンプは、単純なコピーとは異なるものです。たとえば、1)通常の作業に最適である(または機能する)必要はありませんが、2)データの破損に対する優れた耐性と修復性が必要です。
peterh-モニカを2016年

@peterhもちろんですが、git cloneすべてをカバーしています。(1)はオプションであり、必須ではありません。結果がまだ最適化されている場合、それはまだバックアップです(2)はすでにgit自体でカバーされています。-私が伝えたい点は、git clone関連するポイントをすでにカバーしている場合、別のツールが必要なことについてですか?私はまたgit bundle、私の答えが間違っている、または無効であるとは思わないことも好みます。どちらのアプローチも、ホットバックアップとコールドバックアップのどちらとしても見ることができます。
KingCrunch

ファイルのアクセス許可はどうですか?git cloneはそれらを必ずコピーしますか?私が信じるオプションに依存する
アンチレルム

192
git bundle

ファイルが1つだけなので、コピーしやすいので、この方法が好きです。ProGit:小さな喜びのバンドルを
参照してください。 「gitレポジトリにメールを送信するにはどうすればよいですか?」も参照してください

git bundle create /tmp/foo-all --all

詳細です:

git bundlegit show-refで表示される参照のみをパッケージ化します。これには、ヘッド、タグ、リモートヘッドが含まれます。
使用される基礎が宛先によって保持されることが非常に重要です。
宛先でアンパックするときに無視されるため、バンドルファイルに宛先にすでに存在するオブジェクトが含まれるようにして、注意を怠って問題ありません。


そのバンドルを使用するには、存在しないフォルダーを指定して(gitリポジトリの外に)クローンを作成できます。

git clone /tmp/foo-all newFolder

11
完全なバックアップのために--allを追加
sehe

1
これgit bundleは、私の意見では正しい答えであり、受け入れられたものではありません。もし彼がそのような質問をすることができれば、彼はクローンコマンドをよく知っていると思います、そしてそれは彼にとって明らかに十分ではありません(それはクローンであり、ダンプではないので)。ダンプは、単純なコピーとは異なるものです。たとえば、次のとおりです。1)通常の作業に最適である必要はありません(または機能する必要もありません)2)データ破損に対する優れた耐性と修復性が必要です3)多くの場合有用増分バックアップの場合は簡単に比較できますが、コピーの目的ではありません。
peterh-モニカを復元する

3
なお、どちらgit bundlegit clone取得するすべてのもの、例えばフックスクリプトを。
Zitrax

2
@Zitraxはい、それは設計によるものです。フックは危険な場合や、機密情報が含まれる場合があります。
VonC 2016年

git bundleリモートリポジトリに対して使用できますか?
Ryan Shillington、

24

他のいくつかの答えを拡張して、これは私がすることです:

リポジトリをセットアップします。 git clone --mirror user@server:/url-to-repo.git

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

これは、後で追加される新しいものを含め、すべてのブランチとタグをバックアップしますが、削除されたブランチはクローンから削除されないことに注意してください(これはバックアップに適している場合があります)。

これはアトミックなので、単純なコピーのような問題はありません。

http://www.garron.me/en/bits/backup-git-bare-repo.htmlを参照してください


20

KingCrunchVonCによる素晴らしい答えをさらに詳しく

私はそれらを両方組み合わせました:

git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all

その後、reponame.bundle簡単にコピーできるというファイルがあります。次に、を使用して、そこから新しい通常のgitリポジトリを作成できますgit clone reponame.bundle reponame

git bundleリポジトリ内の参照(ブランチまたはタグ)につながるコミットのみをコピーすることに注意してください。したがって、もつれたコミットはバンドルに保存されません。


1
良い要約。+1。
VonC、

2
あなたが意味したと思いますgit bundle create reponame.bundle --allか?
joe

それに気づいてくれて@joeに感謝します。間違いなく。回答を更新します。
Kimmo Ahokas

4

すべてが.gitディレクトリに含まれています。ファイルと同じように、プロジェクトと一緒にバックアップしてください。


2
これは、Gitプロジェクトを含むディレクトリのすべてのコンテンツをバックアップするだけで十分であることを意味しますか?
Ravindranath Akila 2013年

1
Sunilに同意します-これはアトミック操作ではないようです。
jia103 2014

1
また、バックアップの作成中に、そのディレクトリ内のファイルが変更されていないことをどのように確認しますか?
Raedwald、2015年

Raedwaldが示唆したように、この方法ではバックアップの一貫性が失われ、データが失われる可能性があります。したがって、この回答は削除するか、少なくともデータ損失の可能性について警告する必要があります。
Abhishek Anand

彼はcopyor cpコマンドをよく知っていると思いますが、彼のニーズには合いません。そして私はまた、彼は裸のリポジトリを考えています(コピーすることもできますが、フル機能のバックアップではないと思います)。
peterh-モニカを復元する

4

git bundleまたはcloneを使用する

gitディレクトリのコピーはアトミックではないため、適切なソリューションではありません。コピーに長い時間がかかる大きなリポジトリがあり、誰かがリポジトリにプッシュした場合、バックアップに影響します。バンドルを複製または作成しても、この問題は発生しません。


3

最小ストレージサイズでgit-copyを使用してgit repoをバックアップできます。

git copy /path/to/project /backup/project.repo.backup

次に、プロジェクトを復元できます git clone

git clone /backup/project.repo.backup project

2
github.com/cybertk/git-copy/blob/master/bin/git-copy#L8-L36:単純なgit clone --bare+の場合、これは多くの作業のようgit push --forceです。
VonC、2015年

@VonCはい、ただし、再パッケージ中にいくつかの追加機能が含まれる可能性があります。または、それはgitリポジトリの内部構造をマイニングして、最適化(宛先の再構築、または速度向上など)に使用できます。
peterh-モニカを2016年

3

正解はIMOはgit clone --mirrorです。これにより、リポジトリが完全にバックアップされます。

Gitクローンミラーは、リポジトリ全体、メモ、ヘッド、参照などをクローンし、通常はリポジトリ全体を新しいgitサーバーにコピーするために使用されます。これにより、すべてのブランチとすべて、リポジトリ全体がプルダウンされます。

git clone --mirror git@example.com/your-repo.git
  • 通常、レポのクローンにはすべてのブランチは含まれず、マスターのみが含まれます。

  • repoフォルダーをコピーすると、プルインされたブランチのみが「コピー」されます。デフォルトでは、マスターブランチのみ、または以前にチェックアウトした他のブランチになります。

  • また、Git bundleコマンドも望みどおりではありません。「bundleコマンドは、通常git pushコマンドを使用してネットワーク経由でプッシュされるすべてのものをバイナリファイルにパッケージ化し、バイナリファイルに送信して、誰かに電子メールで送信したり、フラッシュドライブに置いたりできます。別のリポジトリにバンドル解除してください。」(git clone --mirrorとgit clone --bareの違いは何ですか


git clone --mirrorは一貫したポイントインタイムバックアップを作成しますか?ユーザーがバックアップ中にコミットをプッシュするとは何ですか?拒否、キューイング、またはバックアップに組み込まれていますか?
Benjamin Goodacre

3

このスレッドは、git reposのバックアップを実行する方法についての洞察を得るために非常に役立ちました。自分にとって「正しい方法」(tm)を見つけるためのヒント、情報、または結論がまだ欠けていると思います。したがって、他の人を助けるためにここで私の考えを共有し、それらを強化するための議論にそれらを置きます。ありがとう。

したがって、元の質問をピックアップすることから始めます。

  • 目標は、gitリポジトリの「完全」バックアップにできる限り近づけることです。

次に、典型的な願望でそれを豊かにし、いくつかの事前設定を指定します。

  • サービスのダウンタイムを回避するために、「ホットコピー」によるバックアップが推奨されます。
  • gitの欠点は、追加のコマンドによって回避されます。
  • スクリプトはバックアップを実行して、1つのバックアップの複数のステップを組み合わせ、人的ミス(タイプミスなど)を回避する必要があります。
  • さらに、スクリプトはリストアを実行して、ダンプをターゲットマシンに適合させる必要があります。たとえば、元のマシンの構成でさえ、バックアップ後に変更されている可能性があります。
  • 環境は、ハードリンクをサポートするファイルシステムを備えたLinuxマシン上のgitサーバーです。

1. "フル" git repoバックアップとは何ですか?

「100%」バックアップとは見方が異なります。ここに2つの典型的なものがあります。

#1開発者の視点

  • コンテンツ
  • 参考文献

gitのは、開発者向けツールであるとを経由してこの観点をサポートgit clone --mirrorしてgit bundle --all

#2管理者の視点

  • コンテンツファイル
    • 特殊なケース「packfile」:gitはガベージコレクション中にオブジェクトを結合してパックファイルに圧縮します(を参照git gc
  • gitの設定
  • オプション:OS構成(ファイルシステムのアクセス許可など)

gitは開発者ツールであり、管理者に任せます。git構成とOS構成のバックアップは、コンテンツのバックアップから分離されていると見なす必要があります。

2.テクニック

  • 「コールドコピー」
    • サービスを停止して、ファイルに排他的にアクセスします。ダウンタイム!
  • 「ホットコピー」
    • サービスは、バックアップの目的で固定状態を提供します。進行中の変更はその状態に影響を与えません。

3.考慮すべきその他のトピック

それらのほとんどはバックアップ用の汎用です。

  • 完全バックアップを保持するのに十分なスペースがありますか?何世代が保存されますか?
  • 漸進的なアプローチが必要ですか?何世代が保存され、いつ完全バックアップを再度作成するのですか?
  • バックアップが作成後または時間の経過とともに破損していないことを確認するにはどうすればよいですか?
  • ファイルシステムはハードリンクをサポートしていますか?
  • バックアップを単一のアーカイブファイルに入れるか、ディレクトリ構造を使用しますか?

4. gitがコンテンツをバックアップするために提供するもの

  • git gc --auto

    • docs:man git-gc
    • リポジトリをクリーンアップして圧縮します。
  • git bundle --all

    • docs:man git-bundle、man git-rev-list
    • Atomic = "ホットコピー"
    • バンドルはダンプファイルであり、gitで直接使用できます(検証、複製など)。
    • 増分抽出をサポートします。
    • 経由で検証可能git bundle verify
  • git clone --mirror

    • docs:man git-clone、man git-fsck、git clone --mirrorとgit clone --bareの違いは何ですか
    • Atomic = "ホットコピー"
    • ミラーは本当のgitリポジトリです。
    • このコマンドの主な目的は、元のリポジトリから定期的に更新をフェッチする完全なアクティブミラーを構築することです。
    • スペースの浪費を避けるために、同じファイルシステム上のミラーのハードリンクをサポートします。
    • 経由で検証可能git fsck
    • ミラーは、完全なファイルバックアップスクリプトの基礎として使用できます。

5.コールドコピー

コールドコピーバックアップでは、常にフルファイルバックアップを実行できます。gitreposへのすべてのアクセスを拒否し、バックアップを実行して、再度アクセスを許可します。

  • 考えられる問題
    • ファイルシステムを介した共有アクセスなど、すべてのアクセスを拒否するのは簡単ではないかもしれません。
    • リポジトリが単一ユーザーのクライアント専用マシンにある場合でも、自動バックアップの実行中にユーザーが何かをコミットする可能性があります:(
    • サーバーでのダウンタイムは許容できない場合があり、複数の巨大なリポジトリのバックアップを実行すると、時間がかかる場合があります。
  • 緩和策のアイデア:
    • 一般的に、クライアントが同じマシン上にある場合でも、ファイルシステムを介した直接リポジトリへのアクセスを防止します。
    • SSH / HTTPアクセスの場合は、git承認マネージャー(gitoliteなど)を使用して、スクリプトで動的にアクセスを管理したり、認証ファイルを変更したりします。
    • リポジトリを1つずつバックアップして、各リポジトリのダウンタイムを削減します。1つのリポジトリを拒否し、バックアップを実行して再度アクセスを許可してから、次のリポジトリを続行します。
    • 開発者の混乱を避けるために計画された保守スケジュールを持っています。
    • リポジトリが変更された場合のみバックアップします。実装が非常に難しいかもしれません。たとえば、オブジェクトのリストとパックファイルを念頭に置いて、設定とフックのチェックサムなどです。

6.ホットコピー

進行中のコミットによってデータが破損するリスクがあるため、アクティブなリポジトリではファイルバックアップを実行できません。ホットコピーは、アクティブなリポジトリの固定状態をバックアップの目的で提供します。進行中のコミットはそのコピーに影響を与えません。上記のように、gitのクローンおよびバンドル機能はこれをサポートしますが、「100%管理」バックアップの場合、追加のコマンドを使用していくつかのことを行う必要があります。

「100%管理者」ホットコピーバックアップ

  • オプション1:git bundle --allコンテンツのフル/インクリメンタルダンプファイルを作成し、構成ファイルを個別にコピー/バックアップするために使用します。
  • オプション2:git clone --mirror構成を個別に使用、処理、コピーしてから、ミラーのフルファイルバックアップを実行します。
    • ノート:
    • ミラーは新しいリポジトリであり、作成時に現在のgitテンプレートが読み込まれます。
    • 構成ファイルとディレクトリをクリーンアップしてから、元のソースリポジトリから構成ファイルをコピーします。
    • バックアップスクリプトは、ミラーのファイル権限などのOS構成も適用する場合があります。
    • ハードリンクをサポートするファイルシステムを使用し、ソースリポジトリと同じファイルシステム上にミラーを作成して、速度を上げ、バックアップ中のスペース消費を減らします。

7.復元

  • ターゲットマシンのgit設定と最新の「実行方法」の考え方を確認して採用します。
  • ターゲットマシンのOS構成と最新の「実行方法」の考え方を確認して採用します。

0
cd /path/to/backupdir/
git clone /path/to/repo
cd /path/to/repo
git remote add backup /path/to/backupdir
git push --set-upstream backup master

これにより、バックアップが作成され、セットアップが行われるため、git pushを実行してバックアップを更新できます。/ path / to / backupdirと/ path / to / repoが少なくとも異なるハードドライブであることを確認してください。そうでない場合、それを行うことはそれほど意味がありません。


もし彼がそのような質問をすることができれば、彼はクローンコマンドをよく知っていると思います、そしてそれは彼にとって明らかに十分ではありません(それはクローンであり、ダンプではないので)。ダンプは、単純なコピーとは異なるものです。たとえば、次のとおりです。1)通常の作業に最適である必要はありません(または機能する必要もありません)2)データ破損に対する優れた耐性と修復性が必要です3)多くの場合有用増分バックアップの場合は簡単に比較できますが、コピーの目的ではありません。
peterh-モニカを2016年

0

2つのオプションがあります。

  1. git repoディレクトリのtarを直接取得できます。サーバーにあるrepoのすべてのコンテンツが含まれているためです。バックアップを取っている間に誰かがリポジトリで作業している可能性があります。

  2. 次のコマンドは、repoのベアクローン(サーバーの場合と同様)を提供し、クローンを作成した場所のtarを問題なく取得できます。

    git clone --bare {your backup local repo} {new location where you want to clone}
    

もし彼がそのような質問をすることができれば、彼はcloneまたはtarコマンドをよく知っていると思います、そしてそれは明らかに十分ではありません(それはクローンであり、ダンプではないためです)。ダンプは、単純なコピーとは異なるものです。たとえば、次のとおりです。1)通常の作業に最適である必要はありません(または機能する必要もありません)2)データ破損に対する優れた耐性と修復性が必要です3)多くの場合有用増分バックアップの場合は簡単に比較できますが、コピーの目的ではありません。
peterh-モニカを2016年

3
ピーター、確かに彼はタールやクローンのコマンドを求めていなかった。よく見ると、それらのコマンドも説明していませんでした。私が説明しようとしていたのは、さまざまなLinuxコマンドが含まれている可能性があるさまざまな方法によるGitバックアップです。これは、それらのLinuxコマンドを教えていることを意味しません。ここにいくつかのアイデアを入れようとしています。
vishal sahasrabuddhe

0

Githubにある場合は、bitbucketに移動し、「リポジトリのインポート」メソッドを使用してgithubリポジトリをプライベートリポジトリとしてインポートします。

それがbitbucketにある場合は、逆に行います。

それは完全バックアップですが、私の理想的な方法であるクラウドにとどまります。


-7

私が知る限り、あなたのリポジトリが置かれているディレクトリのコピーを作成することができます、それだけです!

cp -r project project-backup

誰かこれを確認してもらえますか?これは適切なバックアップを作成するための正しいアプローチだと思います。
Ravindranath Akila 2013年

5
コピー操作中に変更がリポジトリーにコミット/プッシュされると、スナップショットが不整合になる可能性があると思います。のようなgitコマンドを使用git clone --bareすると、一貫したスナップショットが得られます。
Eelke 2013

1
スニルに同意する-これは原子的ではないようです。
jia103 2014

1
@ jia103それがアトミックでない場合、それは必ずしも問題ではありません-あなたがそれを扱っている間、他の誰もリポジトリに到達できないことを保証するために知る必要があり、それができる必要があります。しかし、私はOPが特定のタスクを望んでいると思います。gitreposがタスクに最適化したツールの場合、単純なファイルコピーはおそらく彼にはよく知られています。
peterh-モニカを2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.