2010-10-18 5 views
340

Các git trang bản sao giúp đỡ có này để nói về --mirror:là gì sự khác biệt giữa --mirror git clone git clone và --bare

Thiết lập một tấm gương của các kho lưu trữ từ xa. Điều này ngụ ý --bare.

Nhưng không đi sâu vào chi tiết về cách sao chép --mirror khác với bản sao --bare.

+1

hữu ích, nhưng nếu bạn cũng muốn đẩy gương này vào repo từ xa như github, tôi tìm thấy [liên kết này] (https://help.github.com/articles/duplicating-a-repository#mirroring-a-repository) tiện dụng. –

Trả lời

404

Sự khác biệt là khi sử dụng --mirror, tất cả refs được sao chép như nó vốn có. Điều này có nghĩa là mọi thứ: các chi nhánh theo dõi từ xa, ghi chú, refs/originals/* (bản sao lưu từ bộ lọc-chi nhánh). Repo nhân bản có tất cả. Nó cũng được thiết lập sao cho bản cập nhật từ xa sẽ tìm nạp lại mọi thứ từ nguồn gốc (ghi đè lên các bản sao chép đã sao chép). Ý tưởng thực sự là phản chiếu kho lưu trữ, để có một bản sao tổng, để bạn có thể ví dụ lưu trữ repo trung tâm của bạn ở nhiều nơi, hoặc sao lưu nó lên. Hãy suy nghĩ của chỉ thẳng lên sao chép repo, ngoại trừ một cách git thanh lịch hơn nhiều.

mới documentation khá nhiều nói tất cả điều này:

--mirror

Thiết lập một tấm gương của các kho lưu trữ nguồn. Điều này ngụ ý --bare. So với --bare, --mirror không chỉ ánh xạ các nhánh địa phương của nguồn tới các nhánh địa phương của mục tiêu, nó ánh xạ tất cả các ref (bao gồm các nhánh từ xa, ghi chú, vv) và thiết lập cấu hình refspec sao cho tất cả các ref này bị ghi đè bởi git remote update kho lưu trữ đích.

câu trả lời ban đầu của tôi cũng lưu ý sự khác biệt giữa một bản sao trần và một (không trần) bản sao bình thường - clone phi trần thiết lập theo dõi từ xa ngành, chỉ tạo ra một chi nhánh địa phương cho HEAD, trong khi clone trần sao chép trực tiếp các chi nhánh.

gốc Giả sử có một vài chi nhánh (master (HEAD), next, pu, và maint), một số thẻ (v1, v2, v3), một số chi nhánh từ xa (devA/master, devB/master), và một số refs khác (refs/foo/bar, refs/foo/baz, mà có thể là ghi chú, dấu gạch ngang, không gian tên của các nhà phát triển khác, những người biết).

  • git clone origin-url (không trần): bạn sẽ nhận được tất cả các thẻ sao chép, một chi nhánh địa phương master (HEAD) theo dõi một chi nhánh từ xa origin/master, và chi nhánh ở xa origin/next, origin/pu, và origin/maint. Các nhánh theo dõi được thiết lập sao cho nếu bạn làm một cái gì đó như git fetch origin, chúng sẽ được tìm nạp như bạn mong đợi. Bất kỳ nhánh từ xa nào (trong nhân bản từ xa) và các tham chiếu khác đều bị bỏ qua hoàn toàn.

  • git clone --bare origin-url: bạn sẽ nhận được tất cả các thẻ sao chép, ngành địa phương master (HEAD), next, pu, và maint, không có các chi nhánh theo dõi từ xa. Đó là, tất cả các chi nhánh được sao chép như là, và nó được thiết lập hoàn toàn độc lập, không mong đợi tìm nạp lại. Bất kỳ nhánh từ xa nào (trong nhân bản từ xa) và các tham chiếu khác đều bị bỏ qua hoàn toàn.

  • git clone --mirror origin-url: mỗi lần chỉnh sửa cuối cùng sẽ được sao chép. Bạn sẽ nhận được tất cả các thẻ, chi nhánh địa phương master (HEAD), next, pumaint, các chi nhánh từ xa devA/masterdevB/master, các tham chiếu khác refs/foo/barrefs/foo/baz. Tất cả mọi thứ là chính xác như nó đã được trong nhân bản từ xa. Theo dõi từ xa được thiết lập để nếu bạn chạy git remote update tất cả các lần chỉnh sửa sẽ bị ghi đè từ nguồn gốc, như thể bạn vừa xóa gương và đã kéo lại nó. Như các tài liệu ban đầu đã nói, đó là một tấm gương. Nó được coi là một bản sao giống hệt chức năng, có thể hoán đổi cho nhau với bản gốc.

+0

"Bản sao bình thường" có liên quan đến một bản sao không có cờ --bare hoặc --mirror không? – Sam

+1

Vâng, đúng vậy. Với một bản sao trần, như nó nói trên trang người đàn ông, chi nhánh được sao chép trực tiếp là tốt (không có refs/remotes/origin, không theo dõi). Đã chỉnh sửa. – Cascabel

+0

Bạn có thể thêm một số ví dụ sử dụng khác về sự khác biệt, không chỉ sự khác biệt giữa git-nội bộ? – cmcginty

39
$ git clone --mirror $URL 

là một đoạn ngắn tay cho

$ git clone --bare $URL 
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL) 

(sao chép trực tiếp từ here)

như thế nào hiện tại người đàn ông trang đặt nó:

So với --bare, --mirror không chỉ ánh xạ các nhánh địa phương của nguồn tới các nhánh địa phương của mục tiêu, nó ánh xạ tất cả các ref (i ncluding nhánh từ xa, ghi chú, vv) và thiết lập cấu hình refspec sao cho tất cả các ref này bị ghi đè bởi một git remote update trong kho lưu trữ đích.

+3

Tôi tin rằng bạn phải tuân theo điều đó với một 'git fetch' để nó thực sự giống hệt nhau. Dù sao, đây không phải là câu trả lời - điểm của câu hỏi là "gương từ xa/bản sao khác với một chiếc gương bình thường như thế nào?" – Cascabel

+0

thậm chí tôi cảm thấy đây không phải là câu trả lời đúng. –

+3

Tôi thực sự thích cách này để chứng minh sự khác biệt. Hy vọng rằng nó là chính xác! Tôi hy vọng hfs thêm lệnh tìm nạp. – joeytwiddle

10

Sao chép bản sao từ xa và đưa chúng vào thư mục con có tên 'đây là những điều mà từ xa có'.

Gương sao chép các thông tin từ điều khiển từ xa và đặt chúng vào mức cao nhất của nó - nó thay thế các tham số riêng của nó bằng các điều khiển từ xa.

Điều này có nghĩa là khi ai đó kéo từ gương của bạn và dán các bản sao của gương vào thư mục con của họ, họ sẽ nhận được các thông tin tương tự như trên bản gốc. Kết quả tìm nạp từ một máy nhân bản cập nhật cũng giống như tìm nạp trực tiếp từ repo ban đầu.

18

Thử nghiệm của tôi với git-2.0.0 hôm nay cho biết tùy chọn --mirror không sao chép móc, tệp cấu hình, tệp mô tả, tệp thông tin/loại trừ và ít nhất trong trường hợp thử nghiệm của tôi một vài lần chỉnh sửa (mà tôi không hiểu.) Tôi sẽ không gọi nó là "bản sao có chức năng giống hệt nhau, có thể hoán đổi cho nhau với bản gốc."

-bash-3.2$ git --version 
git version 2.0.0 
-bash-3.2$ git clone --mirror /git/hooks 
Cloning into bare repository 'hooks.git'... 
done. 

-bash-3.2$ diff --brief -r /git/hooks.git hooks.git 
Files /git/hooks.git/config and hooks.git/config differ 
Files /git/hooks.git/description and hooks.git/description differ 
... 
Only in hooks.git/hooks: applypatch-msg.sample 
... 
Only in /git/hooks.git/hooks: post-receive 
... 
Files /git/hooks.git/info/exclude and hooks.git/info/exclude differ 
... 
Files /git/hooks.git/packed-refs and hooks.git/packed-refs differ 
Only in /git/hooks.git/refs/heads: fake_branch 
Only in /git/hooks.git/refs/heads: master 
Only in /git/hooks.git/refs: meta 
9

Một lời giải thích nhiều sắc thái từ các tài liệu GitHub trên Duplicating a Repository:

Như với một bản sao để trần, một bản sao được nhân đôi bao gồm tất cả các chi nhánh từ xa và các thẻ, nhưng tất cả tài liệu tham khảo địa phương sẽ được ghi đè mỗi khi bạn lấy , vì vậy nó sẽ luôn giống như kho gốc.

+1

Cảm ơn bạn; điều này làm rõ cho tôi rằng các thẻ * cục bộ * sẽ bị ghi đè cũng như các nhánh bằng cách sử dụng một bản sao được nhân đôi. Rất hữu ích. – Wildcard

+0

Bạn cũng có thể muốn sử dụng '--prune' khi chạy git fetch để loại bỏ các tham chiếu cục bộ không còn trên điều khiển từ xa nữa. – nishanths

7

Tôi thêm ảnh, hiển thị config khác biệt giữa gương và trần. enter image description here Bên trái là trần, bên phải là gương.Bạn có thể rõ ràng, tệp cấu hình của gương có khóa fetch, có nghĩa là bạn có thể cập nhật nó, bằng cách git remote update hoặc git fetch --all