Có cách nào đơn giản để sao lưu toàn bộ repo git bao gồm tất cả các nhánh và thẻ không?
Có cách nào đơn giản để sao lưu toàn bộ repo git bao gồm tất cả các nhánh và thẻ không?
Câu trả lời:
Điều gì về chỉ làm một bản sao của nó?
git clone --mirror other/repo.git
Mỗi kho lưu trữ là một bản sao lưu từ xa của nó.
git branch -a
. Có thể rõ ràng hơn theo cách này: Sau khi nhân bản một kho lưu trữ mà bạn không tìm nạp mọi chi nhánh, bạn tìm nạp mọi cam kết. Chi nhánh chỉ tham chiếu đến một cam kết hiện có.
git clone
bao gồm tất cả. (1) là tùy chọn, không phải là một yêu cầu. Nếu kết quả vẫn được tối ưu hóa, nó vẫn là bản sao lưu (2) đã được git bao phủ. - Điểm tôi muốn đưa ra là, nếu git clone
đã bao gồm các điểm liên quan, cho những gì bạn cần một công cụ khác? Mặc dù tôi cũng thích git bundle
nhưng tôi không nghĩ câu trả lời của mình sai hoặc không hợp lệ. Bạn có thể thấy cả hai cách tiếp cận là dự phòng nóng và lạnh.
git bundle
Tôi thích phương pháp đó, vì nó chỉ dẫn đến một tệp, dễ dàng sao chép hơn.
Xem ProGit: bó nhỏ niềm vui .
Xem thêm " Làm thế nào tôi có thể gửi email cho ai đó một kho lưu trữ git? ", Trong đó lệnh
git bundle create /tmp/foo-all --all
là chi tiết:
git bundle
sẽ chỉ gói tham chiếu được hiển thị bởi git show-ref : bao gồm các đầu, thẻ và đầu từ xa.
Điều rất quan trọng là cơ sở được sử dụng phải được tổ chức bởi điểm đến.
Không có gì sai sót khi thận trọng, khiến tệp bó chứa các đối tượng đã có trong đích, vì chúng bị bỏ qua khi giải nén tại đích.
Để sử dụng gói đó, bạn có thể sao chép nó, chỉ định thư mục không tồn tại (bên ngoài bất kỳ repo git nào):
git clone /tmp/foo-all newFolder
git bundle
là câu trả lời đúng theo quan điểm của tôi và không phải là câu trả lời được chấp nhận. Tôi nghĩ rằng anh ta biết rõ lệnh clone, nếu anh ta có thể hỏi một câu hỏi như vậy, và rõ ràng nó không đủ cho anh ta (vì đó là một bản sao, và không phải là một bãi rác). Các bãi chứa là những thứ khác nhau như các bản sao đơn giản, ví dụ: 1) chúng không cần phải tối ưu (hoặc thậm chí có khả năng) cho công việc bình thường 2) nhưng chúng được yêu cầu phải có sức đề kháng tốt và khả năng chống lại tham nhũng dữ liệu 3) Nó thường hữu ích nếu chúng dễ dàng khác nhau để sao lưu gia tăng, trong khi đó không phải là mục tiêu trên các bản sao.
git bundle
hoặc git clone
có được mọi thứ , ví dụ các tập lệnh hook.
git bundle
chống lại một repo từ xa?
Mở rộng một số câu trả lời khác, đây là những gì tôi làm:
Thiết lập repo: git clone --mirror user@server:/url-to-repo.git
Sau đó, khi bạn muốn làm mới bản sao lưu: git remote update
từ vị trí nhân bản.
Điều này sao lưu tất cả các nhánh và thẻ, bao gồm cả các nhánh mới được thêm vào sau, mặc dù đáng lưu ý rằng các nhánh bị xóa không bị xóa khỏi bản sao (để sao lưu có thể là một điều tốt).
Đây là nguyên tử nên không có vấn đề gì mà một bản sao đơn giản sẽ xảy ra.
Mở rộng dựa trên các câu trả lời tuyệt vời của KingCrunch và VonC
Tôi kết hợp cả hai:
git clone --mirror git@some.origin/reponame reponame.git
cd reponame.git
git bundle create reponame.bundle --all
Sau đó, bạn có một tập tin được gọi là reponame.bundle
có thể dễ dàng sao chép xung quanh. Sau đó, bạn có thể tạo một kho git bình thường mới từ đó bằng cách sử dụng git clone reponame.bundle reponame
.
Lưu ý rằng git bundle
chỉ các bản sao cam kết dẫn đến một số tham chiếu (nhánh hoặc thẻ) trong kho lưu trữ. Vì vậy, các cam kết rối không được lưu trữ vào gói.
git bundle create reponame.bundle --all
gì?
Tất cả mọi thứ được chứa trong .git
thư mục. Chỉ cần sao lưu cùng với dự án của bạn như bất kỳ tập tin nào.
copy
hoặc cp
ra lệnh rất tốt và nó không phù hợp với nhu cầu của anh ấy. Và tôi cũng nghĩ, anh ấy nghĩ về một kho lưu trữ trần (mặc dù nó cũng có thể được sao chép, tôi nghĩ đó không phải là một bản sao lưu đầy đủ tính năng).
sử dụng gói git, hoặc bản sao
sao chép thư mục git không phải là một giải pháp tốt vì nó không phải là nguyên tử. Nếu bạn có một kho lưu trữ lớn cần nhiều thời gian để sao chép và ai đó đẩy vào kho lưu trữ của bạn, nó sẽ ảnh hưởng đến việc sao lưu của bạn. Nhân bản hoặc tạo một gói sẽ không có vấn đề này.
Bạn có thể sao lưu git repo bằng git-copy ở kích thước lưu trữ tối thiểu.
git copy /path/to/project /backup/project.repo.backup
Sau đó, bạn có thể khôi phục dự án của bạn với git clone
git clone /backup/project.repo.backup project
git clone --bare
+ đơn giản git push --force
.
Câu trả lời đúng IMO là git clone --mirror . Điều này sẽ sao lưu đầy đủ repo của bạn.
Gương nhân bản Git sẽ sao chép toàn bộ kho lưu trữ, ghi chú, đầu, ref, v.v. và thường được sử dụng để sao chép toàn bộ kho lưu trữ sang máy chủ git mới. Điều này sẽ kéo xuống tất cả các chi nhánh và mọi thứ, toàn bộ kho lưu trữ.
git clone --mirror git@example.com/your-repo.git
Thông thường nhân bản một repo không bao gồm tất cả các chi nhánh, chỉ có Master.
Sao chép thư mục repo sẽ chỉ "sao chép" các nhánh đã được kéo vào ... vì vậy theo mặc định đó chỉ là nhánh Master hoặc các nhánh khác mà bạn đã kiểm tra trước đó.
Lệnh bó Git cũng không phải là điều bạn muốn: "Lệnh bó sẽ gói mọi thứ thường được đẩy qua dây bằng lệnh git đẩy vào tệp nhị phân mà bạn có thể gửi email cho ai đó hoặc đặt vào ổ flash, sau đó giải phóng vào kho lưu trữ khác. " (Từ sự khác biệt giữa git clone --mirror và git clone --bare )
Chủ đề này rất hữu ích để có được một số hiểu biết về cách sao lưu của git repos có thể được thực hiện. Tôi nghĩ rằng nó vẫn còn thiếu một số gợi ý, thông tin hoặc kết luận để tìm ra "cách chính xác" (tm) cho chính mình. Do đó, chia sẻ suy nghĩ của tôi ở đây để giúp đỡ người khác và đưa họ lên thảo luận để nâng cao họ. Cảm ơn.
Vì vậy, bắt đầu với việc chọn câu hỏi ban đầu:
Sau đó làm phong phú nó với những mong muốn điển hình và chỉ định một số cài đặt trước:
Quan điểm khác nhau về bản sao lưu "100%" là gì. Đây là hai cái điển hình.
git là một công cụ dành cho nhà phát triển và hỗ trợ quan điểm này thông qua git clone --mirror
và git bundle --all
.
git gc
)git là một công cụ dành cho nhà phát triển và để lại cho quản trị viên. Sao lưu cấu hình git và cấu hình HĐH nên được xem là tách biệt với sao lưu nội dung.
Hầu hết trong số họ là chung cho sao lưu.
git gc --auto
git bundle --all
git bundle verify
.git clone --mirror
git fsck
.Một bản sao lưu dự phòng lạnh luôn có thể thực hiện sao lưu toàn bộ tệp: từ chối tất cả các quyền truy cập vào kho git, sao lưu và cho phép truy cập lại.
Sao lưu tệp không thể được thực hiện với các repos hoạt động do rủi ro dữ liệu bị hỏng bởi các cam kết đang diễn ra. Một bản sao nóng cung cấp trạng thái cố định của một kho lưu trữ đang hoạt động cho mục đích sao lưu. Cam kết liên tục không ảnh hưởng đến bản sao đó. Như được liệt kê ở trên, các chức năng nhân bản và gói của git hỗ trợ điều này, nhưng để sao lưu "100% quản trị viên", một số điều phải được thực hiện thông qua các lệnh bổ sung.
git bundle --all
để tạo các tệp kết xuất đầy đủ / gia tăng nội dung và sao chép / sao lưu các tệp cấu hình riêng biệt.git clone --mirror
, xử lý và sao chép cấu hình riêng biệt, sau đó thực hiện sao lưu toàn bộ tệp nhân bản.
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
điều này tạo ra một bản sao lưu và thực hiện thiết lập, để bạn có thể thực hiện một cú đẩy git để cập nhật bản sao lưu của mình, đó có thể là những gì bạn muốn làm. Chỉ cần đảm bảo rằng / path / to / backupdir và / path / to / repo ít nhất là các ổ đĩa cứng khác nhau, nếu không nó sẽ không có ý nghĩa nhiều để làm điều đó.
Đây là hai lựa chọn:
Bạn có thể trực tiếp lấy một tar của thư mục git repo vì nó có toàn bộ nội dung trống của repo trên máy chủ. Có một khả năng nhỏ là ai đó có thể đang làm việc trên repo trong khi sao lưu.
Lệnh sau sẽ cung cấp cho bạn bản sao hoàn toàn của repo (giống như trong máy chủ), sau đó bạn có thể lấy một vị trí của vị trí mà bạn đã nhân bản mà không gặp vấn đề gì.
git clone --bare {your backup local repo} {new location where you want to clone}
Theo tôi biết bạn chỉ có thể tạo một bản sao của thư mục mà repo của bạn đang ở, vậy thôi!
cp -r project project-backup
git clone --bare
sẽ cung cấp cho bạn một ảnh chụp nhanh nhất quán.