2012-07-04 6 views
16

Tôi có nhánh đặc biệt (nhánh phát hành) là bản sao chính xác của nhánh chính với một số tệp và thư mục bị xóa. Không có sự phát triển nào xảy ra trên nhánh này, tuy nhiên nó phải được đồng bộ với master, vì vậy các bản cập nhật trên master phải được liên tục đẩy tới nhánh đó.Chiến lược hợp nhất Git để bỏ qua các tệp đã xóa

Bằng cách làm việc kết hợp với bình thường (git merge master) Tôi liên tục có được những xung đột tương tự (một tập tin mẫu README ví dụ):

CONFLICT (delete/modify): README deleted in HEAD and modified in master

dự kiến: Tôi cố gắng hợp nhất những thay đổi trong các tập tin, mà tôi đã xóa. Vì vậy, để giải quyết chúng tôi jut sử dụng git rm README.

Để tự động hóa, tôi có thể sử dụng độ phân giải xung đột tự động bằng cách chỉ định -X của chúng tôi. trang Man đề nghị đó là một điều đúng đắn cho tôi:

This option forces conflicting hunks to be auto-resolved cleanly by favoring our version. Changes from the other tree that do not conflict with our side are reflected to the merge result.

Tuy nhiên, khi tôi làm git merge -s recursive -X ours master tôi vẫn nhận được chưa được giải quyết tương tự xóa/sửa đổi mâu thuẫn. Tôi đang làm gì sai? Có cách nào khác để tự động giải quyết xung đột không?

+0

có thể trùng lặp của [Cách thiết lập trình điều khiển git để bỏ qua thư mục khi hợp nhất] (http://stackoverflow.com/questions/3111515/how-to-setup-a-git-driver-to- bỏ qua-một-thư-trên-hợp nhất) - và có một câu trả lời tuyệt vời. – rescdsk

Trả lời

2

Bởi có một cái nhìn tại this question, nó trông giống như chiến lược đệ quy với chúng ta hoặc lựa chọn của họ không xem xét một xóa như một cuộc xung đột.

Điều bạn có thể làm là sử dụng this feature để chỉ định chiến lược cụ thể cho một số tệp. Tôi sẽ đặt cược rằng của chúng tôi chiến lược (không phải tùy chọn) sẽ thực hiện thủ thuật cho các tệp đó.

EDIT:

Như đã trình bày trong các bình luận, bạn không thể làm được điều này!

Bạn chắc chắn là nên liên hệ với mailing list Git nếu đây là một tính năng rất quan trọng với bạn ([email protected])

+0

Có vẻ như nó có thể là giải pháp, nhưng không làm việc cho tôi (hoặc tôi đang làm điều gì đó sai một lần nữa): trong chi nhánh tạo ra và cam kết .gitattribute tập tin với nội dung "README merge = ours". Khi tôi thực hiện 'git merge master' cùng một xung đột xuất hiện –

+1

Đã cố gắng tạo a.tập tin gitignore và đặt 'README' vào đó. Cùng một kết quả –

+1

Có thể, trình điều khiển hợp nhất tùy chỉnh là điều tôi cần? http://stackoverflow.com/questions/928646/how-do-i-tell-git-to-always-select-my-local-version-for-conflicted-merges-on-as –

-1

Bạn có thể sử dụng rebase thay vì hợp nhất để hiện thực chi nhánh phát hành.

+2

Điều đó tạo nên sự khác biệt như thế nào? –

11

Có lẽ một cách tốt hơn để làm điều này, nhưng tôi đã giải quyết một vấn đề tương tự bằng cách thực hiện việc hợp nhất (với chiến lược hợp nhất mặc định) và sau đó chạy

git status --porcelain | awk '{if ($1=="DU") print $2}' | xargs git rm 

Sau này, bạn nên giải quyết mâu thuẫn khác như bình thường và sau đó cam kết.

Việc này chỉ xóa tất cả các tệp đã bị xóa trên nhánh hiện tại mà tôi nghĩ là những gì bạn muốn.

+3

Nếu bạn thực sự muốn chơi với trạng thái 'git', bạn nên sử dụng' --porcelain' để có được kết quả dự đoán. –

+1

@ MichałGórny [Xong.] (Http://stackoverflow.com/a/36470587/1485952) – fnkr

+0

Đã chỉnh sửa câu trả lời để bao gồm các chỉnh sửa của @ fnkr. Cảm ơn –

3
git merge master 
git status --porcelain | awk '{if ($1=="DU") print $2}' | xargs git rm 
git commit