Cara git bundel repo lengkap

116

Saya perlu mentransfer repo lengkap ke mesin non-jaringan baru, lebih disukai sebagai entitas file tunggal. Git bundel memungkinkan git fetch, git pulloperasi gaya dalam lingkungan sneakernet tetapi tampaknya berasumsi bahwa Anda sudah memiliki versi kerja dari repo pada mesin tujuan.

Apa doa yang tepat untuk:

  1. Gabungkan semua cabang di repo saat ini
  2. Jalankan repo baru di direktori tujuan, misalnya, dapatkan root commit dengan benar

Saya telah mengirim tambalan ke hulu untuk mengklarifikasi:

`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>`.

Jadi yang $ git bundle create repo.bundle --branches --tagspaling cocok adalah kloning.

$ git bundle create repo.bundle --all akan memberikan gambar cermin dari mesin sumber Anda, termasuk referensi jarak jauhnya.

Philip Oakley
sumber

Jawaban:

190

Apa doa yang tepat untuk:

  • Gabungkan semua cabang di repo saat ini

Sederhana:

$ git bundle create repo.bundle --all

Berikut repo.bundleadalah nama file bundle yang ingin Anda buat. Perhatikan bahwa --alltidak akan menyertakan cabang pelacak jarak jauh ... seperti klon biasa juga tidak.

  • Jalankan repo baru di direktori tujuan, misalnya, dapatkan root commit dengan benar

Pertama, clonehanya init+ fetch(+ administrativia).

Kedua, Anda dapat menggunakan file bundel di mana pun URL repositori dapat digunakan, jadi Anda dapat clonemenggunakan file bundel:

$ git clone repo.bundle

Ini akan dibuat reposebagai repositori git.

Jakub Narębski
sumber
6
Terima kasih, --allopsinya tidak ada di halaman manual saya untuk bundle(saya melihat versi 1.7.6.msysgit.0), juga tidak menggunakan file .bundle di bagian URL untuk clone. Ini memberi saya kepercayaan diri yang lebih besar untuk merekomendasikan penggunaannya.
Philip Oakley
20
Sinopsis untuk perintah create adalah git bundle create <file> <git-rev-list-args>. Berlari man git-rev-list(atau man git-log) akan memberi Anda --all. Tetapi saya setuju bahwa itu harus lebih terlihat dalam dokumentasi perintah bundel.
Jakub Narębski
1
Saya melihat bahwa halaman manual bundel, di bawah Specifying References, mengatakan bahwa itu "hanya akan memaketkan ref yang ditunjukkan oleh git show-ref", yang tidak menyertakan [daftar] opsi git-rev-list.
Philip Oakley
2
@Philip Oakley: Ini git-rev-list-argsadalah bagaimana Anda memilih ref yang ditunjukkan oleh git show-refperintah.
Jakub Narębski
2
--allmemang menyertakan cabang pelacakan jarak jauh untuk saya (git 2.1.4). Saya bisa melihat refs/remotes/origin/*dengan git bundle list-heads bundlefileatau git ls-remote bundlefile. Meskipun mendapatkannya kembali dari bundel agak rumit.
Alex
33

Pertama, klon repositori, dan sertakan --mirroropsinya.

git clone --mirror [email protected]:path/repo.git

Ini memastikan semua cabang jarak jauh juga merupakan cabang lokal yang siap untuk digabungkan.

Lalu lari

git bundle create repo.bundle --all seperti yang dijelaskan oleh jawaban dari Jakub Narębski

thoutbeckers
sumber
3

Saya sarankan Anda memasang tar atau zip folder .git dan cukup unpack di lokasi baru dan kemudian lakukan git reset --hard HEAD. Semua yang diperlukan untuk semua cabang ada di bawah .git dan yang perlu Anda lakukan hanyalah menyesuaikan remote di file .git / config atau menghapusnya.

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
patthoyts.dll
sumber
4
Satu peringatan adalah Anda harus melihat file .git / config untuk memeriksa apakah pemilik repo asli memiliki barang khusus pengguna di sana.
Noufal Ibrahim
@patthoyts: Mengingat itu terputus, tidak akan ada remote ;-) Sepertinya bundel (mungkin) kehilangan opsi, dan mungkin kloning (perlu memikirkan kloning dari bundel)
Philip Oakley