Làm cách nào để quản lý xung đột với mô đun con git?


127

Tôi có một siêu dự án git tham chiếu một số mô hình con và tôi đang cố gắng khóa một luồng công việc để các thành viên dự án còn lại của tôi làm việc trong đó.

Đối với câu hỏi này, giả sử siêu dự án của tôi được gọi superyvà mô hình con được gọi subby. (Sau đó là đơn giản hóa những gì tôi đang cố gắng thực hiện ... Tôi thực sự không sử dụng các nhánh cho các phiên bản, nhưng tôi nghĩ rằng nó sẽ dễ dàng nhất để đặt ra như một câu hỏi.)

Chi nhánh chính của tôi superycó thẻ v1.0của dự án git được subbytham chiếu như là một mô hình con. Nhánh superyđược gọi one.onevà thay đổi tham chiếu của mô hình con để trỏ đến thẻ v1.1của subby.

Tôi có thể làm việc trong mỗi chi nhánh này mà không gặp trở ngại nào, nhưng nếu tôi cố gắng cập nhật one.onechi nhánh với các thay đổi từ masterchi nhánh, tôi nhận được một số xung đột và tôi không biết cách giải quyết chúng.

Về cơ bản sau khi chạy một git pull . masterlúc trong subbynhánh, có vẻ như nó tạo ra các mô hình con bổ sung.

Trước khi kéo / hợp nhất, tôi nhận được phản hồi mong muốn git submoduletừ one.onechi nhánh:

$ git checkout master
$ git submodule
qw3rty...321e subby (v1.0)
$ git checkout one.one
$ git submodule
asdfgh...456d subby (v1.1)

Nhưng sau khi kéo, nó sẽ thêm các mô đun con bổ sung khi tôi chạy git submodule:

$ git pull . master
Auto-merged schema
CONFLICT (submodule): Merge conflict in subby - needs qu3rty...321e
Automatic merge failed; fix conflicts and then commit the results.

$ git submodule
qw3rty...321e subby (v1.0)
asdfgh...456d subby (v1.1)
zxcvbn...7890 subby (v1.1~1)

Làm cách nào để xóa / bỏ qua các tham chiếu mô hình con không mong muốn và thực hiện các xung đột và thay đổi của tôi? Hoặc có một tham số tôi có thể sử dụng với bản gốc của mình git pullsẽ bỏ qua các mô hình con của tôi?

Câu trả lời:


23

Tôi chưa thấy lỗi chính xác trước đây. Nhưng tôi có một dự đoán về những rắc rối bạn đang gặp phải. Có vẻ như bởi vì masterone.onecác nhánh superychứa các ref khác nhau cho subbymô hình con, khi bạn hợp nhất các thay đổi từ mastergit không biết ref nào - v1.0hoặc v1.1- nên được giữ và theo dõi bởi one.onenhánh của supery.

Nếu đó là trường hợp, thì bạn cần chọn ref mà bạn muốn và cam kết thay đổi đó để giải quyết xung đột. Đó chính xác là những gì bạn đang làm với lệnh reset .

Đây là một khía cạnh khó khăn trong việc theo dõi các phiên bản khác nhau của một mô hình con trong các nhánh khác nhau của dự án của bạn. Nhưng ref mô đun con cũng giống như bất kỳ thành phần nào khác trong dự án của bạn. Nếu hai nhánh khác nhau tiếp tục theo dõi các tham chiếu mô đun con tương ứng sau khi hợp nhất liên tiếp, thì git sẽ có thể tạo ra mô hình mà không làm tăng xung đột hợp nhất trong các lần sáp nhập trong tương lai. Mặt khác, nếu chuyển đổi mô hình con thường xuyên, bạn có thể phải giải quyết rất nhiều xung đột.


1
Cảm ơn đã làm sáng tỏ câu hỏi. Điều đó hoàn toàn có ý nghĩa với tôi bây giờ và lệnh reset hoạt động hoàn hảo cho tình huống của tôi ở trên. Nhưng điều gì sẽ là các lệnh để chấp nhận mô hình con từ nhánh chính và vứt bỏ tham chiếu đến mô hình con của nhánh hiện tại? Tôi biết cách xử lý các xung đột thông thường, nhưng sau ba ngày tìm kiếm trên web, tôi không thể tìm thấy một ví dụ mã nào ngoài rm -r. Và tôi bắt đầu nghĩ rằng có một lý do cho các ví dụ không tồn tại; mô hình con cho đến nay được trừu tượng hóa từ siêu dự án mà bạn phải quản lý mọi chuyển đổi.
Tyler

26
CUỐI CÙNG! Một câu trả lời! Tôi đã added by us: ../Mono.Cecilgit statusnhưng git addgit rmthất bại với Mono.Cecil: needs merge, pathspec 'Mono.Cecil/' did not match any filesvì nó chỉ là một thư mục trống và git chỉ thực sự xử lý tập tin. git checkoutđã cho tôi Mono.Cecil: needs merge, error: you need to resolve your current index first, git submodule updateđã cho Skipping unmerged submodule Mono.Cecilgit checkout master Mono.Cecilcuối cùng đã sửa nó. Vấn đề cơ bản: git statusđề xuất là sai, vì vậy hãy chọn một nhánh và lấy bản sao của thư mục với checkout!
IBBoard

6
@ Lệnh IBBoard đã giúp tôi với tình trạng này - tôi đã cố gắng git checkout --ours SUBMODgit add SUBMODvà những người khác, nhưng cuối cùng làm git checkout master SUBMODcố định các xung đột. Nhận xét này có lẽ nên là một câu trả lời, không phải là một nhận xét ... :)
Colin D Bennett

89

Chà, về mặt kỹ thuật, nó không quản lý xung đột với các mô đun con (ví dụ: giữ cái này nhưng không phải cái kia), nhưng tôi đã tìm ra cách để tiếp tục làm việc ... và tất cả những gì tôi phải làm là chú ý đến git statusđầu ra của mình và đặt lại các mô hình con:

git reset HEAD subby
git commit

Điều đó sẽ thiết lập lại mô hình con cho cam kết trước khi kéo. Mà trong trường hợp này là chính xác những gì tôi muốn. Và trong các trường hợp khác khi tôi cần các thay đổi được áp dụng cho mô hình con, tôi sẽ xử lý những thay đổi đó với quy trình làm việc của mô hình con tiêu chuẩn (kiểm tra tổng thể, kéo xuống thẻ mong muốn, v.v.).


Đối với tôi điều này dường như chỉ thay đổi trạng thái của mô-đun xung đột từ "cả sửa đổi" thành "đã xóa".
Matt Zukowski

4
Thay vào đó, bạn có thể muốn giữ mô hình con của nhánh được hợp nhất: git reset <merged-Branch> subby
Edward Anderson

1
làm việc cho tôi theo quy định trong câu trả lời .. git reset Đường dẫn CHÍNH / đến / mô đun con / dir
estoy

56

Tôi đã vật lộn một chút với các câu trả lời cho câu hỏi này và cũng không gặp nhiều may mắn với các câu trả lời trong một bài viết SO tương tự . Vì vậy, đây là điều làm việc cho tôi - nhớ rằng trong trường hợp của tôi, mô hình con được duy trì bởi một nhóm khác, do đó, xung đột đến từ các phiên bản mô hình con khác nhau trong chủ và chi nhánh địa phương của dự án tôi đang thực hiện:

  1. Chạy git status- ghi chú thư mục mô hình con có xung đột
  2. Đặt lại mô hình con về phiên bản đã cam kết lần cuối trong nhánh hiện tại:

    git reset HEAD path/to/submodule

  3. Tại thời điểm này, bạn có phiên bản mô hình con không xung đột mà bây giờ bạn có thể cập nhật lên phiên bản mới nhất trong kho lưu trữ của mô hình con:

    đường dẫn cd / đến / mô hình con
    git subodule foreach git pull origin SUBMODULE-BRANCH-NAME
  4. Và bây giờ bạn có thể commitlàm điều đó và trở lại làm việc.


16

Đầu tiên, tìm hàm băm bạn muốn mô hình con của bạn để tham khảo. sau đó chạy

~/supery/subby $ git co hashpointerhere
~/supery/subby $ cd ../
~/supery $ git add subby
~/supery $ git commit -m 'updated subby reference'

điều đó đã làm việc cho tôi để đưa mô hình con của tôi đến tham chiếu băm chính xác và tiếp tục với công việc của tôi mà không có thêm bất kỳ xung đột nào.


1
hoặc bạn chỉ có thể thực hiện kiểm tra git - theirs (hoặc --ours) subby
Bachi

@Bachi: git checkout --theirs và --ours không có tác dụng đối với các mô đun con.
Edward Anderson

1
Mặc dù điều này không giải quyết được xung đột, nhưng không dễ để xác định <hashpulumhere>. Tôi không biết một cách dễ dàng để thấy cam kết của mô hình con được kiểm tra ở mỗi bên của xung đột. Bất cứ cam kết nào bạn kiểm tra trong subby có thể khác với hai bên của hợp nhất, không phù hợp trong một cam kết hợp nhất.
Edward Anderson

@nilbus đúng vậy. Chúng tôi đã từ bỏ làm việc với các mô đun con git vì đó là một trong những mối quan tâm của chúng tôi và làm cho nó rất khó để nói ra cam kết nào bạn thực sự muốn. Chúng tôi đã sử dụng trình soạn thảo (php) làm trình quản lý gói, điều mà tôi thực sự thích vì nó tạo ra một tệp khóa khóa các repos thành một hàm băm nhất định. Tuy nhiên, vì chúng tôi đang sử dụng node_modules trong nhiều repos, chúng tôi sẽ chạy vào các mô-đun xung đột ở đây và đó. Chúng tôi đã chuyển sang npm để quản lý công cụ này nhưng đó cũng là một loại sâu khác.
địa ngục

12

Tôi đã có vấn đề này với git rebase -i origin/mastermột chi nhánh. Tôi muốn lấy phiên bản chính của ref của mô hình con, vì vậy tôi chỉ đơn giản là:

git reset master path/to/submodule

và sau đó

git rebase --continue

Điều đó đã giải quyết vấn đề cho tôi.


3
Điều này làm việc cho tôi. Tôi vẫn đang tìm hiểu những gì họ đã làm để làm hỏng mô hình con
Checo R

3

Có sự giúp đỡ từ cuộc thảo luận này. Trong trường hợp của tôi

git reset HEAD subby
git commit

đã làm cho tôi :)


2

Trong thư mục cha mẹ của tôi, tôi thấy:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)

Vì vậy, tôi đã làm điều này

git reset HEAD linux
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.