2014-10-28 17 views
10

Tôi có hai chi nhánh AB. Cả hai chứa một submodule (trong thư mục sub), tuy nhiên tại các cam kết khác nhau (mà không nhanh chóng chuyển tiếp từ một đến khác).Làm thế nào để giải quyết xung đột submodule git nếu submodule không được khởi tạo

A B 
|/
BASE 

Tôi đã kiểm tra A, nhưng mô-đun con chưa được khởi tạo. Bây giờ tôi hợp nhất B và tôi nhận được một cuộc xung đột trên submodule.

$ git status 
Unmerged paths: 
    (use "git add <file>..." to mark resolution) 

     both modified: sub 

Phát hành git checkout --ours sub không làm gì (nếu submodule được khởi tạo nó hoạt động, cũng git checkout-index -f --stage=2 -- sub không hoạt động). git add sub gây ra lỗi error: pathspec 'sub' did not match any file(s) known to git..

$ git diff sub 
diff --cc sub 
index 533da4e,ab2af77..0000000 
--- a/sub 
+++ b/sub 
@@@ -1,1 -1,1 +1,1 @@@ 
- Subproject commit 533da4ea00703f4ad6d5518e1ce81d20261c40c0 
-Subproject commit ab2af775ec467ebb328a7374653f247920f258f3 
++Subproject commit 0000000000000000000000000000000000000000 

git submodule init -- sub không làm gì cả. Ngoài ra git submodule update --init --force -- sub không hoạt động: Skipping unmerged submodule sub.

Vì vậy, làm thế nào tôi có thể giải quyết xung đột submodule này (mà không hủy hợp nhất và thử lại sau khi khởi tạo submodule)?

Trả lời

12

Điều gì làm cho tình huống của bạn gây khó chịu là git sẽ không cho phép bạn khởi tạo một mô-đun con chưa được nhúng, vì vậy lời khuyên thông thường chỉ cần đặt mô-đun con về trạng thái bạn muốn trong môđun con sau đó chạy git add sẽ không hoạt động. Những gì bạn có thể làm là cập nhật trực tiếp chỉ mục mà không phải qua cây đang hoạt động.

Một cách để cập nhật chỉ mục là với git reset. Nếu bạn biết một cam kết trong đó mô-đun con ở trạng thái bạn muốn, bạn có thể sử dụng nó. Ví dụ, bất kỳ những điều sau đây có thể là những gì bạn muốn:

git reset master -- sub 
git reset [email protected]{upstream} -- sub 
git reset HEAD -- sub 
git reset MERGE_HEAD -- sub 

Các tùy chọn khác là để cập nhật các chỉ số trực tiếp sử dụng các lệnh hệ thống ống nước git update-index. Để làm điều đó, bạn cần phải biết rằng một đối tượng kiểu gitlink (ví dụ, mục nhập thư mục trong kho lưu trữ cha trỏ đến một mô-đun con) là 0160000. Không có cách nào để tìm ra từ nguyên tắc đầu tiên, nhưng bạn có thể tìm ra từ git ls-files -s hoặc sau tham khảo (xem "1110 (gitlink)" dưới 4-bit loại đối tượng): https://github.com/gitster/git/blob/master/Documentation/technical/index-format.txt

để sử dụng cách tiếp cận, tìm ra các hash bạn muốn thiết lập các submodule tới, sau đó chạy, ví dụ:

git update-index --cacheinfo 0160000,533da4ea00703f4ad6d5518e1ce81d20261c40c0,sub 
2

Điều này hoạt động giống như kết hợp thông thường: bạn phải cung cấp nội dung chính xác tại đường dẫn đó để git có thể cam kết. Submodule nội dung được lưu trữ như là cam kết hiện tại của nó id, vì vậy bạn phải thêm đường dẫn của submodule để dự án (giống như bạn thêm bất kỳ đường dẫn của tập tin) khi nó có nội dung phù hợp, mà ở đây có nghĩa là tài liệu tham khảo HEAD. Thông thường bạn nhận được điều đó với một thanh toán thông thường.

Trong trường hợp của bạn, bạn không thể có cả nội dung kết quả hợp nhất chính xác ở đường dẫn môđun con và không có nội dung nào cả. Điều duy nhất cần thiết là có một repo tại đường dẫn đó với id cam kết đúng trong HEAD. Các repo chứa thực sự không thể quan tâm ít nơi repo submodule tại con đường đó đến từ, điều duy nhất mà vấn đề tại thời điểm này là cam kết id trong HEAD.

+2

Vâng "Điều này hoạt động giống như việc hợp nhất thông thường", tuy nhiên 'git checkout --ours' và' git add' không hoạt động. Làm cách nào để "cung cấp nội dung chính xác trên đường dẫn đó"?- "Điều duy nhất cần thiết là để có một repo tại đường dẫn đó với đúng cam kết id trong HEAD" - nhưng làm thế nào tôi có thể đạt được điều đó như khởi tạo submodule không hoạt động? – MrTux

+0

Một mô-đun con chỉ là một repo. "Điều duy nhất cần thiết là có một ** repo ** tại đường dẫn đó". 'git clone u: // r/l -b $ đường dẫn yourbranch/to/repo; git thêm đường dẫn/đến/repo; git commit -m done'. – jthill

+0

Tùy chọn này phù hợp với tôi. Tôi chỉ đơn giản là nhân bản phiên bản đúng của repo mất tích ở vị trí submodule và sau đó hợp nhất đã đi qua. –

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