2010-07-26 37 views
42

Tôi là một nhà phát triển solo, làm việc trong kho lưu trữ Git cục bộ. Để sao lưu, tôi muốn gửi một bản sao chính xác của kho lưu trữ đó đến một máy chủ khác.Có phải "git push --mirror" đủ để sao lưu kho lưu trữ của tôi không?

Đủ để làm điều này?

git push --mirror 

Tôi hỏi vì đôi khi tôi có thể chạy lệnh này hai hoặc ba lần trước khi Git nói với tôi "Mọi thứ được cập nhật", vì vậy dường như nó không phải là một tấm gương chính xác. Có vẻ như đang đẩy lùi các chi nhánh theo dõi ...?

$ git push --mirror 
Counting objects: 42, done. 
Delta compression using up to 8 threads. 
Compressing objects: 100% (30/30), done. 
Writing objects: 100% (30/30), 5.09 KiB, done. 
Total 30 (delta 17), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 mybranch -> mybranch 
$ git push --mirror 
Total 0 (delta 0), reused 0 (delta 0) 
To ssh://my/repo/url 
    c094a10..0eedc92 origin/mybranch -> origin/mybranch 
$ git push --mirror 
Everything up-to-date 

Điều gì đang xảy ra và đây có phải là chiến lược tốt không?

Chỉnh sửa: Tôi không thích sử dụng thứ gì đó như git bundle hoặc .tar.bz2 lưu trữ, vì tôi muốn bản sao lưu là bản sao hoạt động có thể truy cập. Vì máy chủ dự phòng của tôi được kết nối với mạng và luôn bật, đây là một cách hay để truy cập kho lưu trữ khi tôi đang trên đường.

+2

Xem thêm: [Sao lưu một địa phương Git Repository] (http://stackoverflow.com/questions/2129214/backup-a-local-git-repository) – miku

+0

Liệu backup này reflog cũng ? Nếu không thì đây là một bản sao lưu khá kém. – onionjake

Trả lời

6

Tôi cho rằng đây là chiến lược hoàn toàn có thể chấp nhận để sao lưu kho lưu trữ của bạn. Nó sẽ thực hiện một push đến remote nguồn gốc của bạn cho mọi ref trong kho. Làm cho nó hoàn thành 'gương' của kho lưu trữ cục bộ của bạn.

EDIT: Tôi vừa xem mô tả được cập nhật của bạn trong câu hỏi. Có vẻ như git đang đẩy ref từ xa của bạn đến chính nó từ xa cùng với mọi thứ khác. Sau khi đẩy xong, ref từ xa sẽ được cập nhật để phản ánh rằng bạn vừa mới đẩy nó. Điều này bây giờ sẽ lỗi thời với kho lưu trữ từ xa, do đó cần đẩy mạnh hơn nữa. Nếu điều này không thỏa mãn bạn. Bạn có thể xóa ref xa xôi này với

git push: nguồn gốc/mybranch

và sau đó sử dụng

git push --all

nhớ rằng won này' t đẩy bất kỳ nhánh mới nào bạn tạo ra.

+0

Vậy tại sao nó lại làm điều gì đó khi tôi chạy nó lần thứ hai? – Thomas

+0

Ý của bạn là gì? Là kho lưu trữ bạn đang đẩy vào một bản sao không? Bạn có thể cung cấp thêm chi tiết như tôi chắc chắn rằng git push --mirror sẽ cung cấp chức năng bạn đang tìm kiếm. –

+5

Cũng đáng biết là nhân bản kho lưu trữ bằng cách sử dụng tùy chọn --mirror sau đó sử dụng 'git remote add --mirror '. Điều này sẽ tự động phản chiếu vì vậy bạn chỉ có thể chạy 'git push'. –

0

Tại sao không chỉ nén một bản sao của thư mục .git và gửi thư đó tới máy chủ khác?

+0

Xem chỉnh sửa của tôi. :) – Thomas

0

Với tinh thần cùng hơn Amber's answer, bạn có thể:

  • push to một bản sao lưu cục bộ created with git bundle
  • sao chép tập tin duy nhất để máy chủ từ xa của bạn.
+0

Xem chỉnh sửa của tôi. :) – Thomas

3

Tôi thường sử dụng git push --all. Tôi chỉ sử dụng --mirror khi tôi cần phải đẩy các chi nhánh mới được tạo ra hoặc tôi đã xóa một số chi nhánh và không muốn đặt tên từng cái một. Nếu không, push --all thường hoạt động như tôi cần.

28

Lý do bạn thấy điều gì đó được đẩy lần thứ hai là --mirror đẩy nhiều hơn một chút so với mong đợi. Ngoài các chi nhánh địa phương của bạn, nó cũng đẩy các nhánh từ xa của bạn, bởi vì gương ngụ ý mọi thứ.Vì vậy, khi bạn đẩy bình thường (hoặc với --mirror), mybranch được đẩy và origin/mybranch được cập nhật để phản ánh trạng thái mới về nguồn gốc. Khi bạn đẩy với --mirror, origin/mybranch cũng được đẩy.

Điều này dẫn đến sự kỳ lạ mà bạn thấy, và cũng trong một sự kỳ lạ tồi tệ hơn khi bạn kéo từ điều khiển từ xa đó; bạn sẽ nhận được các chi nhánh có tên là origin/origin/mybranch vv Vì vậy, tốt nhất nên sử dụng --mirror cho một bản sao thời gian, và chỉ cần sử dụng push bình thường (có thể với --all) để sử dụng bình thường.

Để luôn đẩy tất cả các chi nhánh và các thẻ, bạn có thể cập nhật .git/config như vậy:

[remote "origin"] 
    url = ... 
    fetch = ... 
    push = +refs/heads/* 
    push = +refs/tags/* 

Điều đó sẽ làm cho một sự thúc đẩy bình thường tương tự như một chiếc gương, ngoại trừ việc nó sẽ không xóa các chi nhánh không tồn tại tại nguồn hoặc cho các bản cập nhật không nhanh về phía trước.

+0

Cảm ơn, đó là điều tốt để biết. Tôi nhớ lại đã nhìn thấy các chi nhánh 'origin/origin/* 'tại một số điểm, nhưng dường như tôi đã xóa chúng. Vấn đề với '--all' là nó sẽ không đẩy bất kỳ nhánh mới nào, cũng như không xóa bất kỳ nhánh nào đã bị xóa. Nó không đủ ngu ngốc, và đôi khi tôi có thể là kẻ ngốc. Không có cách nào để nói '--mirror' bỏ qua các nhánh từ xa? – Thomas

+0

Tôi không nghĩ rằng có một cách để làm cho nó bỏ qua điều khiển từ xa. Tuy nhiên, bạn có thể sửa đổi yout '.git/config' để đẩy nhiều hơn cho mỗi mặc định. Tôi đã cập nhật câu trả lời. –

19

Thật không may, bạn không nhận được bản sao chính xác khi nhấn. Bạn lose your stash.

+3

Cảm ơn, đó là điều tốt để biết. Mặc dù vậy, nó không thực sự quan trọng, bởi vì stash được cho là một điều thực sự ngắn hạn. – Thomas

+2

Có, tôi nghĩ rằng nó đủ tốt để sao lưu, nhưng không lý tưởng cho việc đồng bộ hóa. Bên cạnh đó, tất cả chúng ta đều biết chúng ta đôi khi phụ thuộc vào những điều được cho là ngắn hạn. ;) – nschum

+4

Nếu bạn đang giữ stashes cho bất kỳ số lượng thời gian, có thể bạn cần để có được thoải mái hơn làm cho các chi nhánh (: – Jacob

3

Những gì tôi làm là:

Thiết lập các repo: git clone --mirror [email protected]:/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í clone.

Điều này sao lưu tất cả các nhánh, bao gồm các nhánh mới được thêm vào sau, mặc dù đáng chú ý là các nhánh bị xóa sẽ không bị xóa khỏi bản sao (để sao lưu có thể là điều tốt).

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

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