完全なリポジトリをGitバンドルする方法


116

完全なリポジトリを、ネットワークに接続されていない新しいマシンに転送する必要があります。単一のファイルエンティティとしてお勧めします。gitバンドルは、スニーカーネット環境git fetchでのgit pullスタイル操作を許可しますが、宛先マシンにすでに動作しているバージョンのレポがあることを前提としているようです。

以下に対する正しい呼び出しは何ですか?

  1. 現在のリポジトリのすべてのブランチをバンドルする
  2. 宛先ディレクトリで新しいリポジトリを起動します。つまり、ルートコミットを正しくインストールします

明確にするためにパッチをアップストリームに送りました:

`git clone` can use any bundle created without negative refspecs
(e.g., `new`, but not `old..new`).
If you want to match `git clone --mirror`, which would clone other
refs such as `refs/remotes/*`, use `--all`.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use `--branches --tags` for
the `<git-rev-list-args>`.

だから$ git bundle create repo.bundle --branches --tagsクローンに最適です。

$ git bundle create repo.bundle --all リモート参照を含む、ソースマシンのミラーイメージを提供します。

回答:


189

以下に対する正しい呼び出しは何ですか?

  • 現在のリポジトリのすべてのブランチをバンドルする

シンプル:

$ git bundle create repo.bundle --all

repo.bundle作成するバンドルファイルの名前を次に示します。ご了承ください--allリモート追跡の枝を含まないだろう...普通のクローンはどちらかではないだろうように。

  • 宛先ディレクトリで新しいリポジトリを起動します。つまり、ルートコミットを正しくインストールします

最初、 cloneちょうどinit+ fetch(+管理者)です。

次に、リポジトリURLを使用できる場所ならどこでもバンドルファイルを使用できるため、簡単に clone、バンドルファイルからます。

$ git clone repo.bundle

これはrepogitリポジトリとして作成されます。


6
おかげで、--allオプションは私のmanページbundle(バージョン1.7.6.msysgit.0を調べています)にもありませんclone。また、のURLセクションで.bundleファイルを使用していません。その使用を推奨することは私に大きな自信を与えます。
フィリップオークリー

20
createコマンドの概要はgit bundle create <file> <git-rev-list-args>です。実行するman git-rev-list(またはman git-log)は、あなたを与えるだろう--all。しかし、それはバンドルコマンドのドキュメントでより見やすくする必要があることに同意します。
JakubNarębski12年

1
参照の指定の下にあるバンドルのマニュアルページには、git show-ref「で示されるrefのみがパッケージ化されます」とあり、git-rev-listオプションが含まれていません[リスト]。
フィリップオークリー

2
@Philip Oakley:コマンドで表示される参照を選択するgit-rev-list-args方法です。git show-ref
JakubNarębski、2012

2
--all私のためのリモート追跡ブランチが含まれていました(git 2.1.4)。私は見ることができたrefs/remotes/origin/*git bundle list-heads bundlefilegit ls-remote bundlefile。バンドルからそれらを戻すのは少し難しいですが。
Alex

32

最初にリポジトリのクローンを作成し、--mirrorオプションを含めます。

git clone --mirror git@example.org:path/repo.git

これにより、すべてのリモートブランチがローカルブランチでもあり、バンドルできるようになります。

次に実行します

git bundle create repo.bundle --all JakubNarębskiからの回答で説明されているように


3

.gitフォルダーをtarまたはzip圧縮し、新しい場所に解凍してから実行することをお勧めしますgit reset --hard HEAD。すべてのブランチに必要なものはすべて.gitの下にあり、実行する必要があるのは、.git / configファイルでリモートを調整するか削除することだけです。

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD

4
注意点の1つは、.git / configファイルを調べて、元のリポジトリオーナーがユーザー固有のものをそこに持っているかどうかを確認する必要があることです。
Noufal Ibrahim 2012

@patthoyts:切断されているため、リモートはありません;-)バンドルにはオプションがない(ある可能性があります)、おそらくクローン(バンドルからのクローン作成を検討する必要がある)のようです
Philip Oakley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.