Sự khác biệt giữa git clone --mirror và git clone --bare


486

Trang trợ giúp git clone có điều này để nói về --mirror:

Thiết lập một bản sao của 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ề việc --mirrorbản sao khác với --barebản sao như thế nào .


3
hữu ích, nhưng nếu bạn cũng muốn đẩy chiếc gương này đến một repo từ xa như github, tôi thấy liên kết này tiện dụng.
Ăn tại Joes

Câu trả lời:


569

Sự khác biệt là khi sử dụng --mirror, tất cả các refs được sao chép như nó vốn có . Điều này có nghĩa là tất cả mọi thứ: các nhánh theo dõi từ xa, ghi chú, refs / bản gốc / * (sao lưu từ nhánh bộ lọc). Các repo nhân bản có tất cả. Nó cũng được thiết lập để một 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 ref được 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 thể, ví dụ như bạn có thể lưu trữ repo trung tâm của bạn ở nhiều nơi hoặc sao lưu nó. Hãy nghĩ về việc chỉ cần sao chép thẳng vào repo, ngoại trừ theo cách git thanh lịch hơn nhiều.

Các tài liệu mới nói lên tất cả những điều này:

--mirror

Thiết lập một bản sao của kho lưu trữ nguồn. Điều này ngụ ý --bare. So với --bare, --mirrorkhông chỉ ánh xạ các nhánh cục bộ của nguồn tới các nhánh cục bộ 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ú, v.v.) và thiết lập một cấu hình refspec sao cho tất cả các ref này được ghi đè bởi một git remote updatekho 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 bản sao bình thường (không trần) - bản sao không trần tạo ra các nhánh theo dõi từ xa, chỉ tạo ra một nhánh cục bộ HEAD, trong khi bản sao trần sao chép trực tiếp các nhánh.

Nguồn 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ể được ghi chú, ẩn nấp, không gian tên devs khác, ai mà biết được).

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

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

  • git clone --mirror origin-url: Mỗi một trong số các ref đó sẽ được sao chép nguyên trạng. Bạn sẽ nhận được tất cả các thẻ, ngành địa phương master (HEAD), next, pu, và maint, chi nhánh từ xa devA/masterdevB/master, refs khác refs/foo/barrefs/foo/baz. Mọi thứ chính xác như trong điều khiển từ xa. Theo dõi từ xa được thiết lập để nếu bạn chạy git remote updatetất cả các ref sẽ bị ghi đè từ nguồn gốc, như thể bạn vừa xóa gương và lấy 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 chức năng giống hệt nhau, có thể hoán đổi với bản gốc.


"Bản sao bình thường" có đề cập đến một bản sao mà không có cờ --bare hoặc --mirror không?
Sam

1
Vâng, nó có. Với một bản sao trần, như đã nói trên trang man, các nhánh cũng được sao chép trực tiếp (không giới thiệu / từ xa / nguồn gốc, không theo dõi). Đã chỉnh sửa.
Cascabel

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

@Casey đó là những gì bạn đang tìm kiếm? Tôi không nghĩ những gì tôi viết ban đầu là "nội bộ" - thẻ và chi nhánh có rất nhiều tính năng bằng sứ.
Cascabel

"Các nhánh được sao chép là" có nghĩa là các nhánh được sao chép vào cùng một đường dẫn tương đối trên bản sao? Hay nó ngụ ý rằng các nhánh được chuyển đổi theo một cách nào đó?
Sam

56
$ git clone --mirror $URL

là một tay ngắn cho

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

(Sao chép trực tiếp từ đây )

Cách trang hiện tại đặt nó:

So với --bare, --mirrorkhông chỉ ánh xạ các nhánh cục bộ của nguồn tới các nhánh cục bộ 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ú, v.v.) và thiết lập một cấu hình refspec sao cho tất cả các ref này được ghi đè bởi một git remote updatekho lưu trữ đích .


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

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

không thực sự rõ ràng, ví dụ: $ (tên cơ sở $ URL) được dịch sang, v.v.
Kzqai

5
basenamelà tiện ích unix bình thường loại bỏ phần thư mục của một đường dẫn và $()chỉ đơn giản là thay thế lệnh của bash.
Victor Zamanian

6
Điều này vẫn còn --mirrortrong đó. Đây chỉ là một câu trả lời chấp nhận được nếu nó giải thích điều gì git remote add --mirror.
Zenexer

24

Các thử nghiệm của tôi với git-2.0.0 hôm nay cho thấy tùy chọn --mirror không sao chép hook, tệp cấu hình, tệp mô tả, tệp thông tin / loại trừ và ít nhất là trong trường hợp thử nghiệm của tôi một vài ref (mà tôi không ' Tôi hiểu.) Tôi sẽ không gọi nó là "bản sao giống hệt về chức năng, có thể hoán đổi 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

14

Một lời giải thích sắc thái từ tài liệu GitHub về Sao chép Kho lưu trữ :

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 nhánh và thẻ từ xa, nhưng tất cả các tham chiếu cục bộ sẽ được ghi đè mỗi khi bạn tìm nạp, vì vậy nó sẽ luôn giống như kho lưu trữ ban đầu.


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ẽ được ghi đè cũng như các nhánh bằng cách sử dụng một bản sao nhân đôi. Rất hữu ích.
tự đại diện

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

13

Một bản sao sao chép các ref từ điều khiển từ xa và nhét chúng vào thư mục con có tên 'đây là các ref mà điều khiển từ xa có'.

Một chiếc gương sao chép các ref từ điều khiển từ xa và đặt chúng vào cấp cao nhất của chính nó - nó thay thế các ref của chính nó bằng các ref của nó.

Điều này có nghĩa là khi ai đó kéo từ gương của bạn và nhét các ref của gương vào thư mục con mạnh hơn, họ sẽ nhận được các ref tương tự như trên bản gốc. Kết quả của việc 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.


12

Tôi thêm một hình ảnh, cho thấy configsự khác biệt giữa gương và trần. nhập mô tả hình ảnh ở đây Bên trái là trần, bên phải là gương. Bạn có thể rõ ràng, tập tin cấu hình của nhân bản có fetchkhóa, có nghĩa là bạn có thể cập nhật nó, bằng git remote updatehoặcgit fetch --all


3
$ git clone --bare https://github.com/example

Lệnh này sẽ biến bản thân mới thành $ GIT_DIR. Ngoài ra, các đầu nhánh ở điều khiển từ xa được sao chép trực tiếp vào các đầu nhánh cục bộ tương ứng mà không cần ánh xạ. Khi tùy chọn này được sử dụng, cả các nhánh theo dõi từ xa cũng như các biến cấu hình liên quan đều không được tạo.

$ git clone --mirror https://github.com/example

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 nhánh và thẻ từ xa, nhưng tất cả các tham chiếu cục bộ (bao gồm các nhánh theo dõi từ xa, ghi chú, v.v.) sẽ được ghi đè mỗi khi bạn tìm nạp, vì vậy nó sẽ luôn giống như kho lưu trữ ban đầu .

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.