Làm thế nào để git clit bản sao bao gồm các mô hình con?


1994

Tôi đang cố gắng đưa một mô hình con vào một repo. Vấn đề là khi tôi sao chép repo cha, thư mục mô đun con hoàn toàn trống rỗng.

Có cách nào để làm cho nó git clone parent_repothực sự đưa dữ liệu vào thư mục mô hình con không?

Ví dụ: http://github.com/cwolves/fterelize/tree/master/lib/ , nodejs-mysql-nativeđang chỉ vào một mô hình con git bên ngoài, nhưng khi tôi kiểm tra sequelizedự án, thư mục đó trống.


4
Lệnh đó sẽ là git clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23): nó sẽ sao chép và cập nhật các mô hình con trong một lệnh. Xem câu trả lời chỉnh sửa của tôi dưới đây .
VonC

Câu trả lời:


2976

Với phiên bản 2.13 của Git trở lên, --recurse-submodulescó thể được sử dụng thay vì --recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

Lưu ý của biên tập viên: -j8là một tối ưu hóa hiệu suất tùy chọn đã có sẵn trong phiên bản 2.8 và tìm nạp tối đa 8 mô hình con cùng một lúc - xem man git-clone.

Với phiên bản 1.9 của Git cho đến phiên bản 2.12 ( -jcờ chỉ có sẵn trong phiên bản 2.8+):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

Với phiên bản 1.6.5 của Git trở lên, bạn có thể sử dụng:

git clone --recursive git://github.com/foo/bar.git
cd bar

Đối với các bản sao đã được nhân bản hoặc các phiên bản Git cũ hơn, hãy sử dụng:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive

123
Có cách nào để chỉ định hành vi này là mặc định trong kho git của bạn, để các nhân bản ít thông tin sẽ tự động nhận được một mô hình con khởi tạo không?
NHDaly

11
@NHDaly Đáng buồn thay, không. (Ít nhất là tôi không biết, ít nhất.)
Mathias Bynens

6
Và suy nghĩ logic git clone --recursive cũng sẽ cư trú bất kỳ mô hình con của một mô hình con, phải không?
jayarjo


5
@toszter: có khôn ngoan không? Điều gì xảy ra nếu repo giữ cần một phiên bản của mô hình con không master ?
Gauthier

498

Bạn phải làm hai điều trước khi một mô hình con sẽ được điền:

git submodule init 
git submodule update

8
Tôi sợ điều đó ... nó không có nghĩa gì vì bạn đang kiểm tra một dự án một phần trong trường hợp đó. Tôi hiểu rằng các bản cập nhật mô hình con không tự động, nhưng tại sao phiên bản ràng buộc không tự động được kiểm tra ?? Có cách nào để buộc nó? Tôi có một dự án với 3 cấp độ của các mô hình con và có vẻ vô lý khi phải đi qua đó chỉ để thực hiện kiểm tra.
Đánh dấu

11
Vui lòng đọc git-submodule(1)trang man ( kernel.org/pub/software/scm/git/docs/git-submodule.html ). Bạn sẽ tìm ra rằng git submodule updatehỗ trợ một tham số tốt đẹp được gọi là --recursive.
joschi

95
Tại sao không chỉ làm cả hai trong một lệnh? git submodule update --init(Cũng xem câu trả lời của tôi ).
Mathias Bynens

9
Tôi nghĩ tốt hơn là trả lời câu hỏi với hai lệnh này. Nó giải thích tốt hơn làm thế nào để hoàn thành nhiệm vụ.
schmijos

6
@MathiasBynens Một máy mà tôi vừa đăng nhập chỉ có git 1.5.5.6, dường như không hỗ trợ lệnh rút gọn, nhưng hỗ trợ nó như hai lệnh.
Jack Poulson

223

Git 2.23 (Q3 2019): nếu bạn muốn sao chép cập nhật các mô hình con lên phiên bản mới nhất của chúng:

git clone --recurse-submodules --remote-submodules

Nếu bạn chỉ muốn sao chép chúng tại SHA1 được ghi lại của chúng:

git clone --recurse-submodules

Xem bên dưới.


Câu trả lời gốc 2010

Như joschi đề cập trong các bình luận, git submodulegiờ đây hỗ trợ --recursivetùy chọn (Git1.6.5 trở lên).

Nếu --recursiveđược chỉ định, lệnh này sẽ lặp lại vào các mô hình con đã đăng ký và cập nhật bất kỳ mô hình con lồng nhau nào bên trong.

Xem Làm việc với các mô đun con git đệ quy cho phần init.
Xem git submodulegiải thích để biết thêm.

Với phiên bản 1.6.5 của git trở lên, bạn có thể thực hiện việc này một cách tự động bằng cách nhân bản siêu dự án với –-recursivetùy chọn:

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

Cập nhật 2016, với git 2.8: xem " Cách tăng tốc / song song tải xuống các mô hình con git bằng cách sử dụng git clone --recursive? "

Bạn có thể bắt đầu tìm nạp mô hình con bằng cách sử dụng nhiều luồng, song song.
Ví dụ:

git fetch --recurse-submodules -j2

Thậm chí tốt hơn, với Git 2.23 (quý 3 năm 2019), bạn có thể sao chép và kiểm tra mô hình con đến nhánh theo dõi của chúng trong một lệnh!

Xem cam kết 4c69101 (ngày 19 tháng 5 năm 2019) của Ben Avison ( bavison) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 9476094 , ngày 17 tháng 6 năm 2019)

clone: thêm --remote-submodulescờ

Khi sử dụng git clone --recurse-submodulestrước đây không có cách nào chuyển một --remotecông tắc sang git submodule updatelệnh ngầm cho bất kỳ trường hợp sử dụng nào mà bạn muốn các mô hình con được kiểm tra trên nhánh theo dõi từ xa của chúng thay vì SHA-1 được ghi trong siêu dự án.

Bản vá này khắc phục tình trạng này.
Nó thực sự được chuyển --no-fetchđến git submodule updatevới lý do chúng là mô hình con chỉ mới được nhân bản, do đó, việc tìm nạp từ xa chỉ phục vụ để làm chậm mọi thứ.

Điều đó có nghĩa là:

--[no-]remote-submodules:

Tất cả các mô hình con được nhân bản sẽ sử dụng trạng thái của nhánh theo dõi từ xa của mô hình con để cập nhật mô hình con, thay vì SHA-1 được ghi lại của siêu dự án. Tương đương với đi --remotetới git submodule update.


3
Vì vậy, Git phải mất 14 năm để bắt đầu thêm hỗ trợ thích hợp cho các mô hình con, huh. Cảm ơn các cập nhật! Điều gì sẽ xảy ra nếu tôi đã có một bản sao của repo chính mà không có mô hình con và không có SHA1 được ghi lại, và tôi muốn lấy phiên bản mới nhất của mỗi mô hình con. Có thể làm được không?
Hươu cao cổ Violet

1
@VioletGiraffe Nếu kho lưu trữ nhân bản đó có các mô hình con, nó đã "ghi SHA1". Và git submodule update --init --recursive --remotenên cập nhật chúng vào cam kết mới nhất của chi nhánh tương ứng. (ví dụ: stackoverflow.com/a/56981834/6309 )
VonC

1
Hãy để tôi làm rõ với một ví dụ: Tôi có một dự án mẫu trên Github sử dụng các mô hình con và tôi thậm chí đã cam kết sửa đổi cụ thể các mô hình con vào repo mẫu này. Nhưng khi tôi tạo một dự án mới từ repo này, không có lệnh nào bạn liệt kê (không phải clone --recurse-submodules --remote-submodulescũng không submodule update --init --recursive --remote) cho phép tôi thực sự tìm nạp phụ. Tất cả những gì tôi nhận được là một tệp .gitmodules và tôi không thể tìm thấy bất kỳ cách nào để khởi tạo ứng dụng con ngoài việc nhân bản chúng từng cái một. Ít nhất tôi muốn có một kịch bản để thực hiện nó với submodule foreach...
Violet Gi hươu cao cổ

Nếu bạn biết một giải pháp, tôi sẽ hỏi một câu hỏi riêng mà bạn có thể trả lời. Đây là bản thử nghiệm mà tôi không thể tìm thấy bất kỳ cách nào khác ngoài việc sử dụng bằng tay: github.com/VioletGiraffe/TEST
Violet Gi hươu cao cổ

@VioletGiraffe Đó là bởi vì bạn đã thêm và cam kết .gitmodules nhưng không phải là gitlink ( stackoverflow.com/a/16581096/6309 , các mục đặc biệt trong chỉ mục: stackoverflow.com/a/19354410/6309 ) Đây là kho lưu trữ đã đăng ký gitlink thích hợp: github.com/tiagomazzutti/antlr4dart
VonC

109

[Câu trả lời nhanh]

Bạn có thể sử dụng lệnh này để sao chép repo của mình với tất cả các mô hình con:

git clone --recursive YOUR-GIT-REPO-URL

Hoặc nếu bạn đã nhân bản dự án, bạn có thể sử dụng:

git submodule init
git submodule update

33

Nếu mô hình con của bạn đã được thêm vào một nhánh, hãy chắc chắn đưa nó vào lệnh nhân bản của bạn ...

git clone -b <branch_name> --recursive <remote> <directory>

Điều này giống như những gì tôi đang tìm kiếm ... nhưng các mô hình con liệt kê chi nhánh của chúng là 'tách ra'. :(
AceFunk

28

Thử cái này:

git clone --recurse-submodules

Nó tự động lấy dữ liệu mô hình con, giả sử bạn đã thêm các mô hình con vào dự án mẹ.


37
Lưu ý rằng --recurse-submodules--recursivebí danh tương đương .
Joel Purra

@SuperUberDuper trong trường hợp đó bạn có thể làm git submodule update --init --recursivenhư được giải thích trong câu trả lời này
Enrico

25

Tôi nghĩ bạn có thể đi với 3 bước:

git clone
git submodule init
git submodule update

21

Câu trả lời muộn

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

Vì tôi vừa dành cả tiếng đồng hồ để nói chuyện với một người bạn: Ngay cả khi bạn có quyền Quản trị viên trên BitBucket, hãy luôn sao chép kho lưu trữ ORIGINAL và sử dụng mật khẩu của người sở hữu repo. Bực mình khi biết rằng bạn đã chạy vào minetrap này: P


Đó chính xác là những gì tôi đang giải quyết. Vì vậy, bạn đang nói rằng bất cứ ai cần phát triển trên kho lưu trữ bitbucket có các mô hình con phải sử dụng thông tin đăng nhập của người tạo kho lưu trữ? Blech.
jsleuth

@jsleuth Có vẻ như vậy - nó hút THỜI GIAN LỚN ... và tôi biết điều đó.
kaiser

Nghe có vẻ như một lỗi. Bạn đã báo cáo nó với Bitbucket?
Mathias Bynens

@MathiasBynens Bạn có vấp phải vấn đề này không? Đó là một năm rưỡi sau và tôi thực sự không biết liệu đây có phải là trường hợp không.
kaiser

4
Nó không mô tả trả lời câu hỏi OP, nhưng chi tiết một lỗi không liên quan trong Bitbucket; trong đó, tình cờ, có thể rút ngắn thành "sử dụng xác thực khóa SSH".
Treffynnon

18

Hãy thử điều này để bao gồm các mô hình con trong kho git.

git clone -b <branch_name> --recursive <remote> <directory>

hoặc là

git clone --recurse-submodules

18

Bạn có thể sử dụng --recursivecờ khi nhân bản một kho lưu trữ. Tham số này buộc git sao chép tất cả các mô hình con được xác định trong kho lưu trữ.

git clone --recursive git@repo.org:your_repo.git

Sau khi nhân bản, đôi khi các nhánh con có thể được thay đổi, vì vậy hãy chạy lệnh này sau nó:

git submodule foreach "git checkout master"

17

[Câu trả lời nhanh]

Sau khi nhân bản repo gốc (có chứa một số repo mô đun con), hãy làm như sau:

git submodule update --init --recursive

11

Các mô hình con tìm nạp song song nhằm mục đích giảm thời gian cần thiết để tìm nạp một kho lưu trữ và tất cả các mô hình con liên quan của nó bằng cách cho phép tìm nạp nhiều kho lưu trữ cùng một lúc. Điều này có thể được thực hiện bằng cách sử dụng tùy chọn --jobs mới, ví dụ:

git fetch --recurse-submodules --jobs=4

Theo nhóm Git, điều này có thể tăng tốc đáng kể việc cập nhật các kho lưu trữ có chứa nhiều mô hình con. Khi sử dụng các mô-đun --recurse mà không có tùy chọn --jobs mới, Git sẽ tìm nạp từng mô hình con một.

Nguồn: http://www.infoq.com/news/2016/03/git28-release


8

Tôi đã có cùng một vấn đề cho một kho lưu trữ GitHub. Tài khoản của tôi bị thiếu Khóa SSH. Quá trình là

  1. Tạo khóa SSH
  2. Thêm khóa SSH mới vào tài khoản GitHub của bạn

Sau đó, bạn có thể sao chép kho lưu trữ với các mô đun con ( git clone --recursive YOUR-GIT-REPO-URL)

hoặc là

Chạy git submodule initgit submodule updatetìm nạp các mô hình con trong kho đã được nhân bản.


Vâng, đó là Permission denied (publickey). fatal: Could not read from remote repository.lỗi
Ender

5

Thử cái này.

git clone -b <branch_name> --recursive <remote> <directory>

Nếu bạn đã thêm mô hình con trong một nhánh, hãy chắc chắn rằng bạn đã thêm nó vào lệnh clone.


5

Nếu đó là một dự án mới, đơn giản là bạn có thể làm như thế này:

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 

Nếu nó đã được cài đặt hơn:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
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.