2009-09-09 28 views
20

Câu hỏi này có thể được dựa trên tôi thiếu hiểu biết về vai trò của .gits và kho git nói chung nhưng:rsync thư mục .git

Tôi có thể rsync một dir với nội dung mà tôi tạo ra với git init giữa các máy ?

Tôi có một kho lưu trữ trên máy tính xách tay của mình, và cách duy nhất để lấy nó ra khỏi đó là scp/rsync đến một máy chủ từ xa, từ đó tôi có thể tải xuống lại. Tôi có thể rsync cấu trúc thư mục hoàn chỉnh giữa các máy chủ này không?

Trả lời

8

Có, điều đó là có thể. IIRC, git sử dụng một cách tiếp cận tương đối. Vì vậy, an toàn để đồng bộ hóa với một máy tính khác.

+1

Có thể (với sự báo trước đó bộ điều khiển từ xa và thay thế dựa trên hệ thống tập tin có thể không hoạt động) nếu bạn không thực hiện bất kỳ công việc nào trên kho lưu trữ trong rsync. –

1

Có, rsync nhập .git dir là có thể và sẽ tạo ra bản sao hoàn chỉnh của kho lưu trữ.

4

Có thể, nhưng bạn nên làm như vậy với kho lưu trữ trống, như được minh họa trong this thread.

$ git clone --bare ./projet projet.git 
$ rsync -a --stats --delete ./projet.git/ votre.serveur:~/projets/projet.git/ 

Lưu ý: 6 + năm sau, git 2.8 (tháng 3 năm 2016) sẽ chính thức Không dùng nữa và loại bỏ hoàn toàn các git rsync giao thức!

Xem commit 0d0bac6 (30 tháng 1 năm 2016) bởi Jeff King (peff).
(Merged bởi Junio C Hamano -- gitster -- trong commit 9f03176, 17 Feb 2016)

Hóa ra "git clone" trên rsync vận chuyển đã bị phá vỡ khi kho nguồn đã đóng gói tài liệu tham khảo trong một thời gian dài, và không ai để ý cũng không phàn nàn về nó.

Commit 0d0bac6 từ Jeff King (peff) có tất cả chi tiết.

+2

Kho Bare chỉ cần thiết khi bạn muốn đẩy repo đó. Bit nếu bạn chỉ cần sao chép repo mỗi lần, bạn chỉ có thể làm điều đó với một repo đầy đủ. – Ikke

+2

Bạn cũng có thể sử dụng rsync cho toàn bộ kho lưu trữ. Không có gì đặc biệt về kho trống nếu bạn sử dụng rsync. –

+0

@ Ikke: đúng vậy, tôi thường làm loại hoạt động đó với mục đích thúc đẩy nó. – VonC

6

Bạn có thể rsync mà không gặp bất kỳ sự cố nào, nhưng nếu bạn có một số điều khiển từ xa được khai báo với tên máy chủ cục bộ cho máy (ví dụ: chỉ được lưu trữ trong/etc/hosts) thì những thứ đó rõ ràng sẽ không hoạt động.

Tuy nhiên, có lý do nào đó khiến bạn không sử dụng chính git để đồng bộ hóa nội dung không?

+0

Tôi đã đoán rằng máy chủ từ xa của tôi không có git mà tôi không thể đẩy nó đến – svrist

+1

Đúng, nếu bạn muốn sử dụng push qua SSH, bạn phải có git trên máy chủ (nhưng bạn có thể cài đặt cục bộ và sử dụng tùy chọn '--receive-pack' thành' git-push' và tùy chọn tương tự để tìm nạp/kéo/sao chép). Nếu bạn muốn đẩy thông qua HTTP, bạn cần phải có máy chủ web với WebDAV, được cấu hình để cho phép truy cập push cho bạn (không yêu cầu git trên máy chủ). –

27

Có một vài khả năng:

  • Bạn có thể chỉ rsync kho .git (hoặc thậm chí toàn bộ kho lưu trữ cùng với working directory), với điều kiện bạn không có bất kỳ hoạt động trong kho lưu trữ trong rsync ing (cùng tuyên bố từ chối trách nhiệm đối với việc sử dụng giao thức rsync://).

  • Bạn có thể sao chép hoặc lấy bằng phảnrsync giao thức (nơi kho URL/vị trí trông như thế này: "rsync://host.xz/path/to/repo.git/"). Lưu ý rằng giao thức này không được chấp nhận, bởi vì nếu có bất kỳ hoạt động nào trong kho lưu trữ, bạn có thể nhận được bản sao bị hỏng (hoặc tìm nạp).

    Ngoài ra, như tôi đã nghe, nó không hoạt động chính xác với sự hiện diện của các đóng gói được đóng gói từ năm 2007, và không ai để ý đến gần đây. Nó sẽ (nó đã làm) biến mất trong Git 2.8.

  • Hoặc bạn có thể tạo git bundle, rsync hoặc scp trên máy khác, sau đó sao chép hoặc tìm nạp từ gói.

+1

Như tôi lưu ý [trong câu trả lời của tôi dưới đây] (http://stackoverflow.com/a/1398041/6309), git 'rsync: //' giao thức sẽ * cuối cùng * biến mất trong git 2,8 chỉ (tháng 3 năm 2016, 10+ sau bắt đầu được tuyên bố là "không được chấp nhận"!) – VonC

0

Sử dụng rsync để sao lưu .git có thể, nhưng với một lần đánh bắt (ít nhất là bản thân mình) Không thể cập nhật. Lần sau khi bạn thử rsync nó một lần nữa, bạn đã đổi tên đối tượng lớn .. và bạn không thể xóa những .. Không quen thuộc với hệ thống rsync hoặc linux, tôi xóa bản sao lưu .git trước khi tôi rsync nó.

Đó là:

> chmod -R 777 /path/of/your/backup/.git 
> rm -fr /path/of/your/backup/.git 
> rsync /path/of/your/origin/.git /path/of/your/backup/.git 

Tôi biết, điều này rất thuế và ngu ngốc .. Xin vui lòng cho tôi biết là có một cách tốt hơn để làm điều này ..

Các vấn đề liên quan