Làm cách nào để hoàn nguyên con trỏ Gm Submodule vào cam kết được lưu trữ trong kho chứa?


128

Tôi có một mô hình con git trong repo git chính của tôi. Theo tôi hiểu, repo chính lưu trữ giá trị SHA (ở đâu đó ...), chỉ ra cam kết cụ thể của mô hình con mà nó được "liên kết đến".

Tôi đi vào mô hình con của tôi và gõ git checkout some_other_branch. Tôi không biết tôi đến từ đâu.

Tôi muốn hoàn nguyên con trỏ đó để repo chính và mô hình con được đồng bộ hóa một lần nữa.

Bản năng đầu tiên (có lẽ là ngây thơ) của tôi là nói git reset --hard- điều đó dường như hoạt động cho mọi thứ khác. Thật ngạc nhiên, nó không hoạt động cho kịch bản này.

Vì vậy, tôi đã nhận ra rằng tôi có thể gõ git diff, lưu ý ID SHA mà con trỏ mô hình con đã từng có, sau đó đi vào mô hình con và git checkout [SHA ID]... nhưng chắc chắn phải có một cách dễ dàng hơn?

Vì tôi vẫn đang tìm hiểu về các mô đun con git, xin vui lòng sửa chữa thuật ngữ của tôi nếu có những từ cho các khái niệm mà tôi không biết.

Câu trả lời:


167

Bạn muốn cập nhật mô hình con của mình để nó đồng bộ với kho lưu trữ cha mẹ tin rằng nó phải như vậy. Đây là những gì lệnh cập nhật dành cho:

Từ trang con mô đun con:

Cập nhật các mô hình con đã đăng ký, tức là các mô đun con bị thiếu và
kiểm tra các cam kết được chỉ định trong chỉ mục chứa
kho. Điều này sẽ làm cho các mô đun con được tách ra trừ khi
--rebase hoặc --merge được chỉ định hoặc mô hình con chính. $ name.update
được thiết lập để rebase hoặc hợp nhất.

Chạy cái này và tất cả sẽ tốt:

git submodule update

4
Bằng cách nào đó, đối với tôi, tôi cần phải thêm --init. Không có nó, các mô hình con sẽ ở trong một trạng thái với (new commits). Mặc dù các mô hình con của tôi đã được khởi tạo.
Ambidex

@Ambidex có --inittùy chọn là rất quan trọng trong tất cả điều này. Tôi đã được nhắc nhập tên người dùng và mật khẩu vì các mô hình con của tôi được sao chép qua https. Tôi đã đi vào cả hai thư mục và thiết lập các điều khiển từ xa để sử dụng sshgiao thức để kiểm tra.
A-Dubb

1
không hoạt động nếu hàm băm cam kết mô đun con được sửa đổi và không được tạo ra
Tribbloid

có thể thêm - đáng chú ý để bạn không cần phải đi đến tất cả các mô hình con
Gaspa79

21

Để thay đổi cam kết mà một mô hình con trỏ tới, bạn cần kiểm tra phiên bản đó trong mô hình con, sau đó quay lại repo chứa, thêm và cam kết thay đổi đó.

Hoặc, nếu bạn muốn mô hình con có trên phiên bản, repo hàng đầu trỏ tới, hãy làm git submodule update --recursive. Thêm --initnếu bạn vừa nhân bản.

Ngoài ra, git submodulekhông có lệnh mô đun con sẽ hiển thị cho bạn cam kết mà bạn đang trỏ tới. Sẽ có một - hoặc dấu + phía trước cam kết nếu nó không đồng bộ.

Nếu bạn nhìn vào một cái cây có một mô hình con trong đó, bạn có thể thấy rằng mô hình con được đánh dấu commitlà trái ngược với phần còn lại là các đốm màu hoặc cây.

để xem những gì một điểm cam kết cụ thể wrt cho mô hình con bạn có thể:

git ls-tree <some sha1, or branch, etc> Submodule/path

sau đó bạn có thể thấy cam kết hoặc bất cứ điều gì khác nếu bạn muốn bằng cách chuyển nó vào nhật ký, v.v ( git-dirtùy chọn ở cấp lệnh git cho phép bạn bỏ qua việc phải cd xuống mô hình con):

git --git-dir=Submodule/path log -1 $(<the above statement>)

Lệnh dưới đây đã giúp tôi (tôi muốn bỏ qua mọi thay đổi trong mô hình con và trong mô-đun của tôi): cập nhật mô hình con git --init --recursive
Rajesh Goel

6

Một trường hợp khác tôi vừa gặp phải là nếu có một thay đổi chưa được xác định trong mô hình con mà bạn muốn loại bỏ. Cập nhật mô đun con git sẽ không xóa thay đổi đó, cũng sẽ không thiết lập lại git - trên thư mục cha. Bạn cần vào thư mục mô đun con và thực hiện thiết lập lại git --hard. Vì vậy, nếu tôi muốn loại bỏ hoàn toàn các thay đổi chưa được thực hiện ở cả cha mẹ và mô hình con, tôi sẽ làm như sau:

Trong cha mẹ:

git reset --hard

git submodule update

Trong mô hình con:

git reset --hard

5

Sử dụng git ls-tree HEADtrong thư mục "superproject" để xem cam kết của mô hình con ban đầu của bạn là gì. Sau đó thay đổi vào thư mục mô hình con và sử dụng git log --oneline --decorateđể xem nhánh nào được cam kết ban đầu. Cuối cùng , git checkout original-commit-branch.

Sử dụng một số thư mục kiểm tra mà tôi thiết lập, đây là các lệnh có thể trông như thế nào:

$ git --version
git version 1.7.4.1
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   sm2 (new commits)
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git ls-tree HEAD
100644 blob 76813a07ae558db274cefc6d903ec24323fdeb0d    .gitmodules
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    main
160000 commit 7c5889497938cd5699a9234a98ee93947e52b1ed  sm1
160000 commit f68bed61cba6f94cef57554f2cf46a45a4a0d337  sm2
$ cd sm2
$ git log --oneline --decorate
5b8d48f (HEAD, foo1) foo1.1
f68bed6 (origin/master, origin/HEAD, master) Initial commit.
$ git checkout master
Switched to branch 'master'
$ cd ..
$ git status
# On branch master
nothing to commit (working directory clean)

"Superproject" hiển thị mô hình con sm2 ở mức cam kết f68bed6nhưng sm2 có ĐẦU ở đó 5b8d48f. Cam kết mô hình con f68bed6có ba nhánh trên đó có thể được sử dụng để kiểm tra trong thư mục mô hình con.


CẢM ƠN DAN, PERFECTO!
Alec


1

Tôi muốn bỏ qua bất kỳ thay đổi nào trong mô hình con và trong mô-đun của tôi cũng

Lệnh dưới đây đã giúp tôi:

git submodule update --init --recursive
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.