2013-02-08 34 views
28

Tôi gặp sự cố khi làm việc với các mô-đun con git.Không thể kiểm tra đường dẫn con git submodule

Bất cứ khi nào tôi nhận được một tài liệu tham khảo submodule mới từ kho thượng nguồn, thực hiện git submodule update cho kết quả sau:

fatal: reference is not a tree: dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 
Unable to checkout 'dd208d46ecdd1ac0d2b2594a610fe4c9150fece1' in submodule path 'submodule/path' 

Điều quan trọng cần lưu ý là các submodule có một số điều khiển từ xa, trong đó có điều khiển từ xa thượng nguồn nên được sử dụng để cập nhật cây tham chiếu submodule. Tôi đoán rằng vấn đề của tôi là có, nhưng tôi không chắc chắn.

thiết lập của tôi là như sau: Dự án

Git

Remotes:

  1. origin (git ngã ba của tôi)
  2. upstream (dự án repo)

submodule "module", có điều khiển từ xa:

  1. origin (git tôi ngã ba)
  2. upstream (dự án repo)

Có ai biết những gì đang gây ra vấn đề của tôi?

Trả lời

32

Khi làm git submodule update, git cố gắng kiểm tra các cam/cây mà sẽ được lưu trong dự án siêu (trong ví dụ của bạn, một với cam kết id dd208d4...)

Tôi nghĩ rằng bạn nhận được lỗi vì trong submodule có không có đối tượng như vậy. Bạn phải chắc chắn rằng nó ở đó. Thường có nghĩa là bạn phải lấy/kéo nó từ một điều khiển từ xa trước.

Có lẽ bạn phải

git submodule foreach git fetch 
git submodule update 

hoặc có thể

git fetch --recurse-submodules 

Giả sử, rằng submodule được cấu hình, do đó nó có thể lấy mất tích cam kết từ xa origin. Cuối cùng, bạn phải biết, từ đó bạn có thể tìm nạp cam kết còn thiếu và bạn phải lấy nó.

Bạn có thể kiểm tra, cho dù bạn có dd208d4... bằng cách làm một cái gì đó như:

cd ./module 
git log dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 
git cat-file -p dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 
git ls-tree dd208d46ecdd1ac0d2b2594a610fe4c9150fece1 

Một nguyên nhân có thể cho một vấn đề như vậy được, mà một trong những người đã công bố mới cam kết từ các mô-đun siêu, không công bố các cam kết cần thiết từ mô-đun con. Anh ta phải xuất bản các commit từ submodule trước.

+0

cam kết submodule được công bố, vấn đề vẫn còn xảy ra. – Nuzzolilo

6

Hãy chắc chắn rằng các môđun con bị đẩy với:

cd submodule-dir 
git push 

Trong trường hợp của tôi, tôi đã có:

  • cam kết submodule
  • không đẩy
  • cam kết phụ huynh có các mô-đun con được cập nhật
  • đã đẩy phụ huynh

vì vậy không có gì lạ khi không thể tìm thấy nó.

Có thể tự động đẩy hơn nữa với:

git push --recurse-submodules=on-demand 

mà cũng đẩy submodules khi cần thiết, hoặc bắt đầu với 2,7:

git config push.recurseSubmodules on-demand 
git push 
+0

Về cơ bản câu trả lời giống như trước đây, nhưng vấn đề này vẫn xảy ra đôi khi ngay cả khi nó được đẩy. – Nuzzolilo

+0

@Nuzzolilo bạn có thể tạo một ví dụ địa phương có thể tái sản xuất tối thiểu, ví dụ: 'mkdir repo && cd repo && git init && touch a && git add .' ... –

+0

Xem https://github.com/projectkudu/kudu/issues/1972 - Có thể xảy ra với các mô-đun con được truy cập thông qua khóa triển khai trên Github. Xin lỗi, không có thời gian để làm nhiều hơn thế – Nuzzolilo

1

tôi đã cùng một vấn đề và tôi giải quyết thêm một mới cam kết cho dự án mẹ và đẩy tất cả Check the Subproject commit and commit from your module

0

Vấn đề của tôi là trên cat .gitmodules của repo của tôi, tôi đã chỉ sai từ xa cho s repo của ubmodule (ban đầu tôi đã nhân bản nó với remote ban đầu, nhưng sau đó chuyển sang một nhánh của nó; tệp gitmodules không bao giờ được cập nhật để phản ánh thay đổi).

0

Vấn đề của tôi là tôi đã có những thay đổi không được cam kết trong các mô-đun con trong tệp build.gradle của chúng (mà tôi cho rằng đã được thay đổi tự động). Họ xuất hiện trong số git diff. Tôi chỉ cần git checkout . để đặt lại các mô-đun submodule để không có thay đổi và sau đó làm việc git submodule update.

0

chỉ thấy vấn đề này khi tôi quên để đẩy những thay đổi trong một trong các môđun con của tôi

đảm bảo thay đổi được đẩy

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