Tôi có một số dự án phụ thuộc vào cùng một thư viện, mà tôi muốn duy trì một kho lưu trữ git riêng biệt để được quản lý với git-subtree trong mỗi dự án. Vì vậy, ví dụ, trong mỗi dự án tôi có thể làm:xung đột git-subtree khi kéo từ repo trung tâm
project1$ git subtree add --prefix=lib1 /path/to/lib1.git master
project2$ git subtree add --prefix=lib1 /path/to/lib1.git master
Bây giờ trong quá trình làm việc trên project1, tôi thực hiện một số thay đổi để lib1, nói lib1/file1.c, và đẩy lùi này để repo Trung ương:
project1$ git add lib1/file1.c
project1$ git commit -m "updates to lib1"
project1$ git subtree push --prefix=lib1 /path/to/lib1.git master
Cho đến nay, rất tốt. Nhưng bây giờ tôi muốn cập nhật bản sao lib1 của project2. Vì vậy, tôi thử:
project2$ git subtree pull --prefix=lib1 /path/to/lib1.git master
Auto-merging lib1/file1.c
CONFLICT (content): Merge conflict in lib1/file1.c
Automatic merge failed; fix conflicts and then commit the result.
Điều gì đang xảy ra? Tôi biết chắc chắn rằng không có thay đổi nào được thực hiện đối với bất kỳ tệp lib1 nào trong project2, vậy tại sao lại có xung đột ở đây?
Xung đột là một nửa trống, giống như những báo cáo được báo cáo trong this question. Tất cả mọi thứ đang được kéo/đẩy trong một hệ thống duy nhất (OS X), vì vậy tôi biết không có vấn đề với kết thúc dòng như đề xuất ở đó.
Chắc chắn đây là trường hợp sử dụng phổ biến cho git-subtree và có một câu trả lời đơn giản mà tôi không thể thấy. Hãy giúp tôi!
EDIT: Tôi tìm thấy một workaround không thỏa mãn: ngay sau khi đẩy thay đổi đối với cây con, tôi cần phải tái chạy subtree kéo:
project1$ git subtree push --prefix=lib1 /path/to/lib1.git master
project1$ git subtree pull --prefix=lib1 /path/to/lib1.git master
Mặc dù không có thay đổi, nó sẽ tìm thấy một cái gì đó, và thực hiện cam kết hợp nhất. Sau đó, sau khi thực hiện một số thay đổi ở nơi khác, cuộc xung đột sẽ không xảy ra lần thứ hai tôi rút khỏi repo trung tâm. Nhưng nếu tôi quên chạy kéo ngay lập tức sau khi đẩy, kéo tiếp theo sẽ nhận được cuộc xung đột này.
Vì vậy, bây giờ câu hỏi của tôi là, tại sao tính năng này hoạt động? Có một lỗi trong cách git-subtree bài hát đẩy, hoặc tôi thiếu một cái gì đó?
Tuy nhiên, tôi có thể xem xét một khối hexdump của các dòng bị ảnh hưởng. CR có thể đã lén lút bằng cách nào đó, ví dụ: bằng cách dán văn bản từ một số nguồn khác. – chirlu
Tôi đã kiểm tra hexdump cho tệp ở mỗi bước, không có CR's (0d) ở bất kỳ đâu, chỉ LF (0a). Vì vậy, đây không phải là vấn đề, mặc dù nó là tốt để kiểm tra. – user2509951
Nó có thể, tất nhiên, là một số loại lỗi. Git subtree là tương đối mới, sau khi tất cả. Nếu bạn có thể đưa ra một trường hợp thử nghiệm có thể tái sản xuất, bạn có thể viết thư cho danh sách gửi thư git. – chirlu