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 --mirror
bản sao khác với --bare
bản sao như thế nào .
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 --mirror
bản sao khác với --bare
bản sao như thế nào .
Câu trả lời:
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
,--mirror
khô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ộtgit 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 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/master
từ xa và các nhánh từ xa origin/next
,origin/pu
và origin/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à maint
cá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/master
và devB/master
, refs khác refs/foo/bar
và refs/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 update
tấ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.
$ 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
,--mirror
khô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ộtgit remote update
kho lưu trữ đích .
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?"
basename
là 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.
--mirror
trong đó. Đâ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
.
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
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.
--prune
khi 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.
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.
$ 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 .