2014-11-28 15 views
11

Tôi biết có thể có các mô đun con nông bằng cách sử dụng tùy chọn --depth với git submodule update.Bản sao nông với các mô-đun con trong git, cách sử dụng các cam kết nhọn và không sử dụng các commit mới nhất?

Tuy nhiên, nếu tôi chạy

git submodule update --init --recursive --depth 1 

về dự án của tôi với một số môđun con, tôi nhận được một fatal: reference is not a tree. Vì vậy, tôi đã cố gắng một lần nữa với

git submodule update --init --recursive --depth 100 

mà làm việc một cách chính xác, tuy nhiên tôi muốn giữ sâu tại 1.

Dường như với tôi rằng --depth 1 kéo cam kết mới nhất trong submodule, không cam kết được chỉ bởi kho lưu trữ chính, và đó là lý do tại sao đặt nó thành 100 giải quyết vấn đề, vì nó đã kéo danh sách cam kết dài hơn, bao gồm cả các cam kết.

Thật không may, nếu đó là trường hợp thì tôi thường không thể chắc chắn 100 cam kết mới nhất bao gồm số tiền tôi cần.

Làm cách nào để yêu cầu git sử dụng các cam kết nhọn và không cho phép git sử dụng các commit mới nhất trong bản sao nông với các mô-đun con?

Tôi đang sử dụng git 1.9.4 trên Windows.

+0

Xem thêm 'git config -f .gitmodules submodule. .shallow true' với http://stackoverflow.com/a/38895397/6309 – VonC

Trả lời

7

Rất tiếc, dường như không có cách nào để thực hiện git fetch chỉ với một ID cam kết cụ thể. Nếu có tôi thực sự muốn biết. Tuy nhiên tôi đã giải quyết vấn đề của bạn theo hai cách khác nhau: một, nếu có thể, là tạo một thẻ hoặc nhánh trên kho lưu trữ từ xa trỏ đến cam kết mà tôi muốn, nói rằng chúng ta gọi nó là "ref". Bằng cách này tôi có thể lấy ref từ xa và --depth sẽ áp dụng cho nó, không phải là mẹo mới nhất. Thay vì git submodule update --init tôi làm:

git submodule init 
git clone --depth 1 -b ref --separate-git-dir .git/modules/sub/ repository sub 

nơi "phụ" là tên và đường dẫn của submodule (vì đơn giản chúng ta hãy nói rằng họ đều giống nhau)

Một cách khác, nếu bạn không thể tạo thẻ hoặc các chi nhánh trong kho lưu trữ từ xa, là tìm kiếm các cam kết mà bạn muốn trong một vòng lặp:

git submodule init 
id=$(git submodule status|sed -ne 's/.\([a-z0-9]*\) sub.*/\1/p' 
git clone --depth 1 --separate-git-dir -n .git/modules/sub/ repository sub  
cd sub 
while ! git rev-list $id ; do 
    git fetch --depth $((i+=1)) 
done 
git checkout $id 

Bạn có thể tăng nhiều hơn một lần commit để làm cho nó đi nhanh hơn, nhưng bạn có thể kết thúc với một số cam kết trước đó hơn cam kết bạn muốn.

+0

Hey. cảm ơn cho tip, có vẻ như nó gần với những gì tôi đang tìm kiếm. Bạn có biết nếu nó có thể sao chép một thẻ cụ thể từ xa, trong khi vẫn giữ bản sao càng nông càng tốt? Liệu the --depth 1 có hoạt động với thẻ ref không? –

+0

Xin lỗi vì trả lời rất muộn, tôi nhớ câu trả lời cho câu hỏi của bạn là có, nhưng tôi không thể kiểm tra lại ngay bây giờ. chỉ vì tò mò, bạn đã thử nó, và nó có hoạt động như bạn muốn không? – kouk

+0

Vâng, tôi đã thử, và nó hoạt động tốt. Tuy nhiên, tôi đã chọn thiết lập dự án khác và tránh sử dụng các mô-đun con cho bây giờ. –

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