2011-10-24 27 views
78

Tôi có một git submodule trong repo git chính của tôi. Theo tôi hiểu nó, repo chính lưu trữ một giá trị SHA (một nơi nào đó ...), trỏ đến cam kết cụ thể của submodule rằng nó được "liên kết với".Làm thế nào để trở lại một con trỏ Submodule Git đến cam kết được lưu trữ trong kho chứa?

Tôi đã truy cập vào mô-đun con của mình và nhập git checkout some_other_branch. Tôi không biết tôi cam kết từ đâu.

Tôi muốn hoàn nguyên con trỏ đó để repo chính và mô-đun con được đồng bộ lại.

Bản năng đầu tiên (có thể ngây thơ) của tôi là để nói git reset --hard - có vẻ như hoạt động với mọi thứ khác. Trước sự ngạc nhiên của tôi, nó không hoạt động cho kịch bản này. Vì vậy, tôi đã tìm ra rằng tôi có thể gõ git diff, lưu ý ID SHA mà con trỏ submodule sử dụng để có, và sau đó đi vào submodule 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, vui lòng sửa thuật ngữ của tôi nếu có các từ cho khái niệm mà tôi không biết.

Trả lời

112

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

Từ manpage submodule:

 
Update the registered submodules, i.e. clone missing submodules and 
checkout the commit specified in the index of the containing 
repository. This will make the submodules HEAD be detached unless 
--rebase or --merge is specified or the key submodule.$name.update 
is set to rebase or merge. 

Run này và tất cả nên cũng:

git submodule update 
+2

Bằng cách nào đó, cho tôi rằng tôi cần để thêm '--init'. Không có nó, các mô-đun con sẽ ở trong trạng thái với '(các commit mới)'. Mặc dù submodules của tôi đã được khởi tạo. – Ambidex

+0

@Ambidex có tùy chọn '--init' là rất quan trọng trong tất cả điều này. Tôi đã nhận được nhắc nhở cho tên người dùng và mật khẩu kể từ khi submodules của tôi đã được nhân bản trên https. Tôi đã đi vào cả hai thư mục và thiết lập điều khiển từ xa để sử dụng giao thức 'ssh' để kiểm tra. –

14

Để thay đổi cam kết mà một mô-đun con trỏ đến, bạn cần phải kiểm tra phiên bản đó trong mô-đun con, sau đó quay trở lại kho chứa, thêm và cam kết thay đổi đó.

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

Ngoài ra, git submodule không có lệnh submodule sẽ hiển thị cho bạn cam kết bạn đang trỏ đến. Sẽ có dấu - hoặc + ở 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ây có mô-đun con trong đó, bạn có thể thấy rằng môđun con được đánh dấu là commit trái ngược với phần còn lại là các đốm màu hoặc cây cối.

để xem những gì một đặc biệt cam kết điểm wrt để submodules bạn có thể:

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

sau đó bạn có thể thấy các cam kết hoặc bất cứ điều gì khác nếu bạn thích bằng cách đi qua đó vào nhật ký, vv (tùy chọn git-dir tại git cấp độ lệnh cho phép bạn bỏ qua việc phải chuyển xuống đĩa CD dưới dạng mô-đun con):

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

Sử dụng git ls-tree HEAD trong thư mục "superproject" để xem những gì cam kết submodule của bạn ban đầu là lúc. Sau đó, thay đổi vào thư mục submodule và sử dụng git log --oneline --decorate để xem chi nhánh nào 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 tôi thiết lập, đây là những gì các lệnh có thể trông giống như:

$ 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) 

Các "superproject" cho thấy submodule SM2 tại cam f68bed6 nhưng SM2 có nó ĐẦU tại 5b8d48f. Các submodule cam kết f68bed6 có ba chi nhánh trên nó có thể được sử dụng để kiểm tra trong thư mục submodule.

+0

THANKS DAN, PERFECTO! – Alec

2

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

Trong phụ huynh:

git reset --hard 

git submodule update 

Trong submodule:

git reset --hard 
Các vấn đề liên quan