Giả sử kho lưu trữ của mô hình con có chứa một cam kết bạn muốn sử dụng (không giống như cam kết được tham chiếu từ trạng thái hiện tại của siêu dự án), có hai cách để thực hiện.
Việc đầu tiên đòi hỏi bạn phải biết cam kết từ mô hình con mà bạn muốn sử dụng. Nó hoạt động từ các mạng bên trong, ngoài ra bằng cách điều chỉnh trực tiếp mô hình con sau đó cập nhật siêu dự án. Công cụ thứ hai hoạt động từ các bên ngoài, trong cộng đồng bằng cách tìm ra cam kết của siêu dự án đã sửa đổi mô hình con và sau đó đặt lại chỉ mục của siêu dự án để tham chiếu đến một cam kết mô hình con khác.
Trái ngược
Nếu bạn đã biết mà phạm bạn muốn submodule để sử dụng, cd
đến submodule, hãy kiểm tra các cam kết mà bạn muốn, sau đó git add
và git commit
nó trở lại trong các siêu dự án.
Thí dụ:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Rất tiếc, ai đó đã thực hiện một cam kết siêu dự án đề cập đến một cam kết chưa được công bố trong mô hình con sub
. Bằng cách nào đó, chúng tôi đã biết rằng chúng tôi muốn mô hình con được cam kết 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Đến đó và kiểm tra nó trực tiếp.
Thanh toán trong mô hình con
$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..
Vì chúng tôi đang kiểm tra một cam kết, điều này tạo ra một ĐẦU tách rời trong mô hình con. Nếu bạn muốn chắc chắn rằng mô hình con đang sử dụng một nhánh, thì hãy sử dụng git checkout -b newbranch <commit>
để tạo và kiểm tra một nhánh tại cam kết hoặc kiểm tra nhánh mà bạn muốn (ví dụ: một nhánh có cam kết mong muốn ở đầu).
Cập nhật siêu dự án
Một kiểm tra trong mô hình con được phản ánh trong siêu dự án như là một sự thay đổi cho cây làm việc. Vì vậy, chúng ta cần giai đoạn thay đổi chỉ số của siêu dự án và xác minh kết quả.
$ git add sub
Kiểm tra kết quả
$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Bản cập nhật mô hình con im lặng vì mô hình con đã ở mức cam kết đã chỉ định. Khác biệt đầu tiên cho thấy chỉ số và worktree là như nhau. Khác biệt thứ ba cho thấy sự thay đổi theo giai đoạn duy nhất là di chuyển sub
mô hình con sang một cam kết khác.
Cam kết
git commit
Điều này cam kết mục nhập mô hình con cố định.
Ngoài vào trong
Nếu bạn không chắc chắn nên sử dụng cam kết nào từ mô hình con, bạn có thể xem lịch sử trong siêu dự án để hướng dẫn bạn. Bạn cũng có thể quản lý thiết lập lại trực tiếp từ siêu dự án.
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Đây là tình huống tương tự như trên. Nhưng lần này chúng tôi sẽ tập trung vào việc sửa nó từ siêu dự án thay vì nhúng vào mô hình con.
Tìm Cam kết Errant của siêu dự án
$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
OK, có vẻ như nó đã bị hỏng ce5d37c
, vì vậy chúng tôi sẽ khôi phục mô hình con từ cha mẹ của nó ( ce5d37c~
).
Ngoài ra, bạn có thể lấy cam kết của mô hình con từ văn bản vá ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) và sử dụng quy trình trên bên trong, ngoài quy trình Thay thế.
Thanh toán trong siêu dự án
$ git checkout ce5d37c~ -- sub
Điều này đặt lại mục nhập mô hình con cho sub
những gì nó đã được cam kết ce5d37c~
trong siêu dự án.
Cập nhật mô hình con
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
Bản cập nhật mô hình con đã hoạt động tốt (nó chỉ ra một ĐẦU tách rời).
Kiểm tra kết quả
$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Các khác biệt đầu tiên cho thấy sub
bây giờ là như nhau trong ce5d37c~
. Khác biệt thứ hai cho thấy chỉ số và worktree là như nhau. Khác biệt thứ ba cho thấy sự thay đổi theo giai đoạn duy nhất là di chuyển sub
mô hình con sang một cam kết khác.
Cam kết
git commit
Điều này cam kết mục nhập mô hình con cố định.