Làm thế nào để git bó một repo hoàn chỉnh


116

Tôi cần chuyển một repo hoàn chỉnh sang một máy không nối mạng mới, tốt nhất là một thực thể tệp duy nhất. Bó git cho phép git fetch, git pullhoạt động phong cách trong một môi trường sneakernet nhưng dường như giả định rằng bạn đã có một phiên bản làm việc của repo trên máy đích.

Lời mời đúng là gì:

  1. Gói tất cả các chi nhánh trong repo hiện tại
  2. Khởi động repo mới trên thư mục đích, tức là cài đặt cam kết gốc

Tôi đã gửi một bản vá ngược dòng để làm rõ:

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

Vì vậy, $ git bundle create repo.bundle --branches --tagstốt nhất phù hợp với nhân bản.

$ git bundle create repo.bundle --all sẽ cung cấp hình ảnh phản chiếu của máy nguồn của bạn, bao gồm cả máy chủ từ xa.

Câu trả lời:


188

Lời mời đúng là gì:

  • Gói tất cả các chi nhánh trong repo hiện tại

Đơn giản:

$ git bundle create repo.bundle --all

Đây repo.bundlelà tên của tệp bó bạn muốn tạo. Lưu ý rằng --allsẽ không bao gồm các nhánh theo dõi từ xa ... giống như bản sao thông thường cũng không.

  • Khởi động repo mới trên thư mục đích, tức là cài đặt cam kết gốc

Đầu tiên, clonechỉ là init+ fetch(+ quản trị).

Thứ hai, bạn có thể sử dụng tệp bó ở mọi nơi mà URL kho lưu trữ có thể được sử dụng, do đó bạn có thể chỉ cần clonetừ tệp bó:

$ git clone repo.bundle

Điều này sẽ tạo ra reponhư một kho lưu trữ git.


6
Cảm ơn, các --alltùy chọn không có trong trang người dùng của tôi cho bundle(Tôi đang xem phiên bản 1.7.6.msysgit.0), cũng như việc sử dụng tệp .bundle trong phần URL cho clone. Nó giúp tôi tự tin hơn để giới thiệu việc sử dụng nó.
Philip Oakley

20
Bản tóm tắt cho lệnh tạogit bundle create <file> <git-rev-list-args>. Chạy man git-rev-list(hoặc man git-log) sẽ cung cấp cho bạn --all. Nhưng tôi đồng ý rằng nó sẽ được hiển thị nhiều hơn trong tài liệu lệnh bó.
Jakub Narębski

1
Tôi thấy rằng trang man gói, trong phần Xác định tham chiếu, nói rằng nó "sẽ chỉ gói ref được hiển thị bởi git show-ref", không bao gồm [list] các tùy chọn git-rev-list.
Philip Oakley

2
@Philip Oakley: Đây git-rev-list-argslà cách bạn chọn ref được hiển thị bằng git show-reflệnh.
Jakub Narębski

2
--allđã bao gồm các nhánh theo dõi từ xa cho tôi (git 2.1.4). Tôi có thể thấy refs/remotes/origin/*với git bundle list-heads bundlefilehoặc git ls-remote bundlefile. Mặc dù nhận được chúng trở lại từ các gói là ít khó khăn.
Alex

32

Đầu tiên sao chép kho lưu trữ, và bao gồm --mirrortùy chọn.

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

Điều này đảm bảo tất cả các chi nhánh từ xa cũng là các chi nhánh địa phương sẵn sàng để đóng gói.

Sau đó chạy

git bundle create repo.bundle --all như được mô tả bởi câu trả lời từ Jakub Narębski


3

Tôi sẽ đề nghị bạn tar hoặc zip thư mục .git và chỉ cần giải nén nó ở vị trí mới và sau đó làm git reset --hard HEAD. Mọi thứ cần thiết cho tất cả các nhánh đều nằm dưới .git và tất cả những gì bạn cần làm là điều chỉnh mọi điều khiển từ xa trong tệp .git / config hoặc xóa chúng.

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
Một lưu ý là bạn sẽ cần xem tệp .git / config để kiểm tra xem chủ sở hữu repo ban đầu có bất kỳ nội dung cụ thể nào của người dùng trong đó không.
Noufal Ibrahim

@patthoyts: Cho rằng nó bị ngắt kết nối, sẽ không có điều khiển từ xa ;-) Có vẻ như gói (có thể) thiếu một tùy chọn và có thể nhân bản (cần suy nghĩ về việc nhân bản từ một gói)
Philip Oakley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.