web-dev-qa-db-ja.com

GitHubリポジトリをバックアップする

次の要件を前提として、GitHubでホストされているgitリポジトリのローカルバックアップを作成する最善の方法は何ですか?

  1. ローカルバックアップは、ベアリポジトリである必要があります。

  2. バックアップにはすべてのブランチが含まれている必要があります。

  3. バックアップは(増分的に)簡単に更新できるはずです。

基本的に、簡単に更新できる可能性のある完璧なミラーが必要です。そのため、コマンド

git clone --mirror git://github.com/...

思い浮かびますが、私が知る限り、それは簡単な更新を許可しません(ローカルバックアップを削除して再作成する必要があります)。また、git cloneのミラーオプションはごく最近のようで、作業中のシステム(gitの少し古いバージョンが実行されているシステム)にはありません。

この種の問題に対して推奨される解決策は何ですか?

56
Michael Goerz

ミラーを作成するには:

git clone --mirror git://github.com/user/project.git

更新するには:

cd project.git
git remote update

現在のディレクトリを変更せずに更新するには:

git --git-dir project.git remote update
43

すべての要件をカバーできるかどうかはわかりませんが、チェックアウトできます git bundle

git bundle

このコマンドは、git fetchおよびgit pullのサポートを提供し、オブジェクトと参照を元のマシンのアーカイブにパッケージ化し、git fetchおよびgit pullを使用して別のリポジトリにインポートします。何らかの方法でアーカイブを移動する

このソリューションで私が気に入っているのは、作成した単一のファイルで、まさにその中に欲しいものがあります

git bundleは、git-show-refで表示される参照のみをパッケージ化します。これには、ヘッド、タグ、リモートヘッドが含まれます。

machineA$ git bundle create file.bundle master

注: Kent Fredric は、コメントに git rev-list からの微妙な言及があります:

--all

$GIT_DIR/refs/のすべての参照が<commit>としてコマンドラインにリストされているかのようにふりをします。

彼は付け加えます:

現在のバンドルはコミットの親のみをバンドルするため、おそらく--allを指定してeverything(branchesの完全なバンドルを取得する必要があります。つまり、マスターの子孫)。

違いを確認するには:

$ git bundle create /tmp/foo master
$ git bundle create /tmp/foo-all --all
$ git bundle list-heads /tmp/foo
$ git bundle list-heads /tmp/foo-all
46
VonC

しかし、私が知る限り、それでは簡単な更新ができません(ローカルバックアップを削除して再作成する必要があります)。

それが何を意味するのかわからない、それを更新するのと同じくらい簡単でなければなりません

git fetch

git cloneは、リモートブランチで表示される参照/コミットを取得するallとして想定されています。

git clone --mirrorgit clone --bareとそれほど変わりません [source]

関連する唯一の違いは、簡略表記のgit remote add --mirror

(異なる動作についてはgit help addを参照してください)

本当に心配なら、これを行うことができます:

git clone --no-hardlinks --mirror $original $dest 

とにかく同じファイルシステム上にあった場合にのみ異なることを行います。

そして、あなたが本当にパラノイアなら、tar。(gz | bz2)ディレクトリ全体とその後ろ上。

9
Kent Fredric

GitHubをバックアップする必要があるリポジトリの場合、単純なBashスクリプトを見ることができます。

https://github.com/ptrofimov/github-backup-sh

3

あなたが求めていることは、gitの制約内で行うことは非常に困難です。問題は、クローニングもフェッチもデフォルトではすべてのブランチを提供しないことです。この質問をご覧ください:

複数のブランチを持つレポのクローンを作成する例については、ここにトランスクリプトがあります:

% git clone -o tufts linux.cs.tufts.edu:/r/ghc/git/experimental.git
Initialized empty Git repository in /usr/local/nr/git/ghc/experimental/.git/
% cd experimental/
% git fetch
% git branch -a
* head
  tufts/HEAD
  tufts/experimental
  tufts/head
  tufts/norman
% git branch --track experimental tufts/experimental
Branch experimental set up to track remote branch refs/remotes/tufts/experimental.
% git branch --track norman tufts/norman
   ...

プログラムで各ブランチのクローンを作成することは、少し注意が必要です。

Githubがrsyncまたは nison へのアクセスを提供する場合、これらはジョブに適したツールです。そうでなければ、恐ろしいスクリプトを書く必要があります...

0
Norman Ramsey

私はRubyスクリプトを他の人の助けを借りて書きました:

https://github.com/walterjwhite/project.configuration/blob/master/scripts/github.com.backup.Ruby

このスクリプトにより、すべてのリポジトリをダウンロードできます。作業中のプロジェクトのバックアップを定期的に作成するために使用します。

これがお役に立てば幸いです。お気軽に調整してください。バグがあると思いますが、GitHubがタイムアウトし、スクリプトがそれを処理しない場合があります。

0
Walter White