Sao lưu đầy đủ một repo git?


136

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?


2
Tôi đoán bạn đang đề cập đến một repos git địa phương ở đây.
Ztyx


3
Câu trả lời đúng là thực hiện: git clone --mirror git@example.com/your-repo.git Điều này sẽ sao chép toàn bộ kho lưu trữ, ghi chú, chi nhánh, theo dõi, v.v.
John

Một số tìm kiếm trên web mà tôi đã chạy không bao gồm câu hỏi này trong kết quả của nó: "git clone hoàn toàn mọi thứ thẻ ghi chú"; "Git nhân bản mọi thứ trong kho"; "Git sao chép một repo với tất cả các ghi chú thẻ".
Kenny Evitt

Câu trả lời:


64

Đ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ó.


7
@Daniel: Nếu bạn sao chép một kho lưu trữ, bạn tìm nạp mọi chi nhánh, nhưng chỉ có một mặc định được kiểm tra. Hãy thử 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ó.
KingCrunch

1
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.
peterh - Phục hồi Monica

@peterh Chắc chắn, nhưng git clonebao 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 bundlenhư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.
KingCrunch

Điều gì về quyền truy cập tập tin? git clone có nhất thiết phải sao chép những thứ đó không? phụ thuộc vào các lựa chọn mà tôi tin
antirealm

192
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 bundlesẽ 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

11
thêm --all để sao lưu hoàn toàn
sehe

1
Đây git bundlelà 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.
peterh - Phục hồi Monica

3
Lưu ý rằng không git bundlehoặc git clonecó được mọi thứ , ví dụ các tập lệnh hook.
Zitrax

2
@Zitrax Vâng, đó là do thiết kế. Móc có thể nguy hiểm hoặc bao gồm thông tin nhạy cảm.
VonC

Tôi có thể sử dụng git bundlechống lại một repo từ xa?
Ryan Shillington

24

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 updatetừ 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.

Xem http://www.garron.me/en/bits/backup-git-bare-repo.html


20

Mở rộng dựa trên các câu trả lời tuyệt vời của KingCrunchVonC

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.bundlecó 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 bundlechỉ 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.


1
Tóm tắt tốt. +1.
VonC

2
Tôi nghĩ bạn có ý git bundle create reponame.bundle --allgì?
joe

Cảm ơn @joe đã nhận thấy điều đó. Chắc chắn rồi. Tôi sẽ cập nhật câu trả lời.
Kimmo Ahokas

4

Tất cả mọi thứ được chứa trong .gitthư 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.


2
Điều này có nghĩa là, chỉ cần sao lưu TẤT CẢ nội dung của thư mục chứa dự án Git là đủ?
Ravindranath Akila

1
Đồng ý với Sunil - đây dường như không phải là một hoạt động nguyên tử.
jia103

1
Và làm thế nào để bạn đảm bảo không có thay đổi nào được thực hiện đối với các tệp trong thư mục đó trong khi tạo bản sao lưu?
Raedwald

Như Raedwald gợi ý, phương pháp này có thể dẫn đến một bản sao lưu không nhất quán và do đó dẫn đến mất dữ liệu. Do đó, câu trả lời này nên được loại bỏ, hoặc ít nhất, cảnh báo về khả năng mất dữ liệu.
Abhishek Anand

Tôi nghĩ rằng anh ấy biết copyhoặc cpra 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).
peterh - Phục hồi Monica

4

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.


3

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

2
github.com/cybertk/git-copy/blob/master/bin/git-copy#L8-L36 : có vẻ như rất nhiều công việc cho một git clone --bare+ đơn giản git push --force.
VonC

@VonC Có, nhưng nó có thể có một số tính năng bổ sung trong quá trình đóng gói lại hoặc nó có thể khai thác cấu trúc bên trong của repo git, nó có thể sử dụng để tối ưu hóa (tái cấu trúc đích hoặc tăng tốc độ, v.v.).
peterh - Tái lập Monica

3

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 )


Git clone --mirror có tạo bản sao lưu theo thời gian nhất quán không? Người dùng đẩy một cam kết trong quá trình sao lưu là gì? Có bị từ chối, xếp hàng hoặc kết hợp vào bản sao lưu không?
Benjamin Goodacre

3

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:

  • Mục tiêu là đến càng gần càng tốt với bản sao lưu "đầy đủ" của kho git.

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:

  • Sao lưu qua "bản sao nóng" được ưu tiên để tránh thời gian ngừng dịch vụ.
  • Những thiếu sót của git sẽ được xử lý bằng các lệnh bổ sung.
  • Một tập lệnh nên thực hiện sao lưu để kết hợp nhiều bước cho một bản sao lưu duy nhất và để tránh những lỗi của con người (lỗi chính tả, v.v.).
  • Ngoài ra, một tập lệnh nên thực hiện khôi phục để điều chỉnh kết xuất với máy đích, ví dụ, ngay cả cấu hình của máy ban đầu cũng có thể đã thay đổi kể từ khi sao lưu.
  • Môi trường là một máy chủ git trên máy Linux với hệ thống tệp hỗ trợ các liên kết cứng.

1. Sao lưu git repo "đầy đủ" là gì?

Quan điểm khác nhau về bản sao lưu "100%" là gì. Đây là hai cái điển hình.

Quan điểm của nhà phát triển số 1

  • Nội dung
  • Người giới thiệu

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 --mirrorgit bundle --all.

# 2 Quan điểm của quản trị viên

  • Tệp nội dung
    • Trường hợp đặc biệt "packfile": git kết hợp và nén các đối tượng thành các packfile trong quá trình thu gom rác (xem git gc)
  • cấu hình git
  • Tùy chọn: Cấu hình hệ điều hành (quyền hệ thống tệp, v.v.)

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.

2. Kỹ thuật

  • "Sao chép lạnh"
    • Dừng dịch vụ để có quyền truy cập độc quyền vào các tập tin của nó. Thời gian chết!
  • "Sao chép nóng"
    • Dịch vụ cung cấp một trạng thái cố định cho mục đích sao lưu. Những thay đổi đang diễn ra không ảnh hưởng đến trạng thái đó.

3. Các chủ đề khác để suy nghĩ về

Hầu hết trong số họ là chung cho sao lưu.

  • Có đủ không gian để giữ các bản sao lưu đầy đủ? Có bao nhiêu thế hệ sẽ được lưu trữ?
  • Là một cách tiếp cận gia tăng muốn? Có bao nhiêu thế hệ sẽ được lưu trữ và khi nào tạo lại một bản sao lưu đầy đủ?
  • Làm thế nào để xác minh rằng một bản sao lưu không bị hỏng sau khi tạo hoặc theo thời gian?
  • Hệ thống tập tin có hỗ trợ các liên kết cứng không?
  • Đặt sao lưu vào một tệp lưu trữ duy nhất hoặc sử dụng cấu trúc thư mục?

4. Những gì git cung cấp cho nội dung sao lưu

  • git gc --auto

    • tài liệu: người đàn ông git-gc
    • Dọn dẹp và thu gọn một kho lưu trữ.
  • git bundle --all

    • docs: man git-bundle, man git-rev-list
    • Nguyên tử = "Sao chép nóng"
    • Gói là các tệp kết xuất và có thể được sử dụng trực tiếp với git (xác minh, sao chép, v.v.).
    • Hỗ trợ khai thác gia tăng.
    • Kiểm chứng qua git bundle verify.
  • git clone --mirror

    • docs: man git-clone, man git-fsck, Sự khác biệt giữa git clone --mirror và git clone --bare
    • Nguyên tử = "Sao chép nóng"
    • Gương là kho git thực.
    • Mục đích chính của lệnh này là xây dựng một máy nhân bản hoạt động đầy đủ, định kỳ tìm nạp các bản cập nhật từ kho lưu trữ ban đầu.
    • Hỗ trợ liên kết cứng cho gương trên cùng một hệ thống tệp để tránh lãng phí không gian.
    • Kiểm chứng qua git fsck.
    • Gương có thể được sử dụng làm cơ sở cho một tập lệnh sao lưu tập tin đầy đủ.

5. Sao chép lạnh

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.

  • Các vấn đề có thể xảy ra
    • Có thể không dễ dàng - hoặc thậm chí có thể - từ chối tất cả các truy cập, ví dụ: truy cập được chia sẻ qua hệ thống tệp.
    • Ngay cả khi repo ở trên máy chỉ dành cho khách hàng với một người dùng, thì người dùng vẫn có thể cam kết điều gì đó trong quá trình sao lưu tự động :(
    • Thời gian chết có thể không được chấp nhận trên máy chủ và thực hiện sao lưu nhiều repos lớn có thể mất nhiều thời gian.
  • Ý tưởng cho giảm thiểu:
    • Ngăn chặn truy cập repo trực tiếp thông qua hệ thống tệp nói chung, ngay cả khi các máy khách ở trên cùng một máy.
    • Đối với truy cập SSH / HTTP, hãy sử dụng trình quản lý ủy quyền git (ví dụ: gitolite) để tự động quản lý quyền truy cập hoặc sửa đổi các tệp xác thực theo cách được viết theo kịch bản.
    • Sao lưu repos từng cái một để giảm thời gian chết cho mỗi repo. Từ chối một repo, thực hiện sao lưu và cho phép truy cập lại, sau đó tiếp tục với repo tiếp theo.
    • Có kế hoạch bảo trì để tránh sự khó chịu của các nhà phát triển.
    • Chỉ sao lưu khi kho lưu trữ đã thay đổi. Có thể rất khó thực hiện, ví dụ như danh sách các đối tượng cộng với việc có các gói dữ liệu, tổng kiểm tra cấu hình và các móc nối, v.v.

6. Sao chép nóng

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.

Sao lưu dự phòng nóng "100% admin"

  • Tùy chọn 1: sử dụng 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.
  • Tùy chọn 2: sử dụng 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.
    • Ghi chú:
    • Một bản sao là một kho lưu trữ mới, được điền với mẫu git hiện tại khi tạo.
    • Dọn dẹp các tệp cấu hình và thư mục, sau đó sao chép các tệp cấu hình từ kho lưu trữ nguồn gốc.
    • Kịch bản sao lưu cũng có thể áp dụng cấu hình HĐH như quyền truy cập tệp trên máy nhân bản.
    • Sử dụng hệ thống tệp hỗ trợ các liên kết cứng và tạo bản sao trên cùng hệ thống tệp với kho lưu trữ nguồn để tăng tốc độ và giảm mức tiêu thụ dung lượng trong quá trình sao lưu.

7. Khôi phục

  • Kiểm tra và áp dụng cấu hình git cho máy mục tiêu và triết lý "cách làm" mới nhất.
  • Kiểm tra và áp dụng cấu hình HĐH cho máy mục tiêu và triết lý "cách làm" mới nhất.

0
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 đó.


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.
peterh - Tái lập Monica

0

Đây là hai lựa chọn:

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

  2. 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}
    

Tôi nghĩ rằng anh ta biết rõ về lệnh clone hoặc tar, 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.
peterh - Tái lập Monica

3
peterh, Chắc chắn anh ta không yêu cầu lệnh tar hoặc clone. Nếu bạn nhìn kỹ, tôi cũng sẽ không giải thích những mệnh lệnh đó. Những gì tôi đã cố gắng giải thích là sao lưu Git thông qua phương thức khác nhau có thể bao gồm các lệnh Linux khác nhau, điều đó không có nghĩa là tôi đang dạy các lệnh linux đó. Tôi đang cố gắng đặt vài ý tưởng ở đây.
vishal sahasrabuddhe

0

Nếu có trên Github, hãy điều hướng đến bitbucket và sử dụng phương thức "nhập kho" để nhập repo github của bạn dưới dạng repo riêng.

Nếu nó ở trong bitbucket, hãy làm khác.

Đó là một bản sao lưu đầy đủ nhưng vẫn ở trong đám mây, đó là phương pháp lý tưởng của tôi.


-7

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

Bất cứ ai có thể xin vui lòng xác nhận điều này? Tôi cảm thấy đây là cách tiếp cận phù hợp để tạo một bản sao lưu thích hợp.
Ravindranath Akila

5
Tôi nghĩ rằng bạn có thể kết thúc với một ảnh chụp nhanh không nhất quán khi trong quá trình thao tác sao chép được cam kết / đẩy vào kho lưu trữ. Sử dụng các lệnh git như git clone --baresẽ cung cấp cho bạn một ảnh chụp nhanh nhất quán.
Eelke

1
Đồng ý với Sunil - điều này dường như không phải là nguyên tử.
jia103

1
@ jia103 Không phải lúc nào cũng là vấn đề nếu nó không phải là nguyên tử - bạn chỉ cần biết và cần có khả năng, để đảm bảo rằng không ai khác có thể tiếp cận repo trong khi bạn đang làm việc với nó. Nhưng tôi nghĩ OP muốn một công cụ cụ thể, cho git repos được tối ưu hóa cho nhiệm vụ, sao chép tệp đơn giản có lẽ là nổi tiếng đối với anh ta.
peterh - Tái lập Monica
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.