2012-12-12 28 views
18

Tôi có một repo git với một submodule git bên trong của nó. Submodule được lưu trữ trên bitbucket. Tôi muốn cập nhật bản sao địa phương của mô-đun con đến cam kết mới nhất của nó. Tôi mệt mỏi "git submodule update" tuy nhiên điều đó không làm gì cả. Vì vậy, tôi đã cố gắng xóa thư mục submodule và sau đó làm "git submodule init" Tuy nhiên nó chỉ đơn giản là kéo các submodule ban đầu cam kết, không phải là mới nhất.git submodule init không kéo cam kết mới nhất

Làm cách nào để nhận mô-đun con cục bộ của tôi cập nhật lên lần commit mới nhất?

Trả lời

26

Git đang thực hiện chính xác những gì nó phải làm. git submodule update sẽ đặt mô-đun con của bạn thành những gì mà commit hiện tại trong repo chính xác định submodule sẽ ở. Bằng cách này, bạn có thể kiểm tra chi nhánh khác, cam kết cũ hơn hoặc thẻ, sau đó chạy git submodule update và mô-đun con sẽ được đặt thành tham chiếu mong đợi để toàn bộ giải pháp của bạn sẽ có phụ thuộc thỏa mãn.

Những gì bạn cần làm là:

cd mysubmoduledir 
git fetch 
git checkout master # or any other branch that you need the latest of 
git merge origin/master 
cd - # go back to the top repo 
git status # should show that your submodule changed 
git add mysubmoduledir 
git commit -m "Updated my solution to use latest sub project." 

một phiên bản ngắn hơn là:

cd mysubmoduledir 
git pull # assumes you are already on the branch you need to be on 
cd - 
git commit -am "Updated submodule" # assumes you had no other modified files 

Từ "cập nhật" không phải là điều tốt nhất cho lệnh submodule này. Nó thực sự có nghĩa là "trỏ submodule đến commit mà commit của cha mẹ repo mong đợi".

Cập nhật mô-đun con thành một cam kết khác (không phải là mới nhất) yêu cầu bạn nhập cd vào thư mục đó, thao tác nó như một repo git thông thường để cam kết hiện tại là những gì bạn muốn, sau đó quay trở lại và cam kết thay đổi này trên repo cấp cao nhất.

+0

Thật là một tên vô lý đối với một lệnh ?! Nó rõ ràng nên được git submodule etadpu –

+0

Suy nghĩ về điều này "git submodule ilikepancakes" có lẽ sẽ làm cho ý nghĩa nhiều. Và nếu bất kỳ ai không đồng ý, vui lòng đọc bản trình bày khôn ngoan về thiết kế không gian hạt nhân apis: http://man7.org/conf/lca2013/Why_kernel_space_sucks-2013-02-01-printable.pdf –

+0

Thông tin chi tiết về cách sử dụng mô-đun con git ': https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ –

5

Mỗi cam kết git bao gồm một mối quan hệ submodule với một cam kết cụ thể trong kho lưu trữ submodule.

Lệnh git submodule update được cung cấp để cập nhật phiên bản đã kiểm tra của mô-đun con đến cam kết được ghi lại cho phiên bản hiện tại của kho lưu trữ gốc. Điều này thực sự có thể là một phiên bản cũ hơn so với những gì bạn hiện đã kiểm tra trong submodule đó, ví dụ nếu bạn đang kiểm tra một phiên bản cũ của kho lưu trữ cha mẹ mà sử dụng một phiên bản cũ của submodule.

Để nhận phiên bản mới hơn của mô-đun con, hãy chuyển sang thư mục đó và cập nhật nó như bạn thực hiện với bất kỳ kho lưu trữ git nào khác (ví dụ: kéo từ kho lưu trữ ngược dòng). Nếu bạn thực hiện bất kỳ cam kết mới hoặc bạn kéo từ một kho lưu trữ khác với một trong những bạn sử dụng như là nguồn cho submodule, hãy chắc chắn để đẩy thay đổi của bạn ra ngoài. Sau khi thực hiện xong, bạn có thể quay trở lại kho lưu trữ cha và thay đổi submodule để ghi lại submodule mới mà bạn đang sử dụng cho submodule trong phiên bản hiện tại cũng như các phiên bản tương lai cho đến khi bạn thực hiện cập nhật khác.

2

Chỉ cần thử lệnh dưới đây sau khi bạn đã thêm các mô-đun con của mình.

cho git v 1.8.x

git submodule update --init --recursive --remote 

cho v1.7.x:

git submodule update --init --recursive hoặc git pull --recurse-submodules

cho v1.6.x

git submodule foreach git pull origin master 

để kiểm tra phiên bản git của bạn.

git version 
Các vấn đề liên quan