2011-08-10 24 views
7

Tôi đã sử dụng git cho một chút bây giờ nhưng vẫn tránh xa submodules vì ​​tôi đã không có một lý do chính đáng để sử dụng chúng. Tuy nhiên, gần đây tôi đã bắt đầu một dự án rõ ràng cần sử dụng tính năng này của git.Git cập nhật submodule với một chi nhánh chưa được phân loại

Tuy nhiên, mỗi lần tôi sao chép toàn bộ dự án, mô-đun con sẽ kết thúc trong nhánh không có tên. Dưới đây là các lệnh tôi thực hiện:

git clone <url to project> 
git submodule update --init <submodule> 
cd <submodule>; git branch 

và nó in ra:

* (no branch) 
    master 

tôi cần phải làm thêm

git checkout master 

Bây giờ câu hỏi của tôi là: đây là hành vi tiêu chuẩn? Nếu không, bạn có thể giúp tôi hiểu những gì tôi đang làm sai?

Cảm ơn

Trả lời

5

Không giống như một số SCM khác, cam kết trong Git không vốn đã thuộc về bất kỳ chi nhánh nào đó. Đầu nhánh giống như một dấu trang cho một cam kết. Khi bạn đã kiểm tra chi nhánh (ví dụ: tệp .git/HEAD chứa tham chiếu đến chi nhánh) và bạn thực hiện cam kết, Git sẽ di chuyển dấu trang đó về phía trước để trỏ đến cam kết mới.

Nhưng hành vi theo dõi này không áp dụng ở đây. Như bạn đã biết, một mô-đun con được ghim vào một cam kết cụ thể; nó không theo dõi một đầu chi nhánh. Khi bạn cập nhật một mô-đun con, Git sẽ kiểm tra rằng cam kết cụ thể chỉ. Điều đó có nghĩa là .git/HEAD chứa hàm băm cam kết chứ không phải chi tiết ref.

Có thể có một hoặc nhiều chi nhánh đứng đầu cam kết này, nhưng đó là loại không liên quan. Chỉ khi HEAD chứa ref chi nhánh, không phải là băm cam kết, sẽ git branch cho biết bạn đang ở trên chi nhánh.

+0

Cảm ơn! Trên thực tế tôi không biết rằng submodules đã được gắn vào một cam kết cụ thể và bây giờ bạn đã giải thích nó, nó làm cho cảm giác hoàn hảo. – Fred

+0

Có cách nào để thực hiện điều này 'git checkout master' xảy ra tự động không? Nó đã gây ra cho tôi giờ thất vọng, và tôi không thấy một lý do để không làm cho nó thanh toán tổng thể theo mặc định. –

+0

Tôi cũng đã thất vọng bởi hành vi 'git' này! Làm thế nào chúng ta không thể sử dụng 'git checkout 'ngay từ đầu? –

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