2009-11-27 24 views
22

Tôi đã đọc một vài câu hỏi git ở đây, nhưng không thể tìm thấy câu trả lời cho cái này:Git: sáp nhập chi nhánh công cộng và tư nhân trong khi vẫn giữ một số tập tin còn nguyên vẹn ở cả hai chi nhánh

Tôi có một công cộng và tư nhân các nhánh mà tôi muốn cho phép một số tệp nhất định phân tách.

Đó là các tệp cấu hình có mật khẩu và tùy chỉnh cục bộ của tôi.

Tôi muốn có thể hợp nhất các nhánh theo cả hai cách: từ riêng tư sang công khai và ngược lại, nhưng tôi không muốn các tệp cụ thể đó được hợp nhất tự động.

Có cách nào để thiết lập git theo cách này không? Tôi rất muốn tìm một giải pháp tự động :) - để việc hợp nhất có thể được thực hiện như bình thường.


EDIT: đây là giải pháp mà làm việc cho tôi (Nhờ VonC cho những lời khuyên trên gitattribute)

điều bất ngờ chỉ dành cho tôi là "hợp nhất bảo vệ" bắt đầu làm việc chỉ sau khi file có tách ra ở hai chi nhánh, không phải ngay lập tức sau khi cấu hình sau đây được áp dụng

.gitattributes (track với git nếu bạn muốn chia sẻ điều này) hoặc .git/info/thuộc tính:

file1  merge=keepmine 
path/file2  merge=keepmine 

keepmine là người quản lý tùy chỉnh merge tên đó chỉ là một lệnh do-không có gì gọi là thay vì người lái xe hợp nhất nội bộ trên các tập tin được lựa chọn, được thành lập dưới

Khi sáp nhập từ tin đến chi nhánh nào tôi thường làm git merge --squash private . Bằng cách đó, các chỉnh sửa riêng tư sẽ không đi vào lịch sử git trên nhánh công cộng.

.git/config:

#public repository 
[remote "origin"] 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    url = <public repo git url> 

#private repository 
#has to set up with git init and populated with the initial commit to branch mybranch 
[remote "private"] 
    push = +: 
    url = /path/to/local/private/repo 
[merge "keepmine"] 
    name = dont_merge_selected_files 
    driver = echo %O %A %B 
[branch "master"] 
    remote = origin 
    merge = refs/heads/master 

#private branch settings 
[branch "mybranch"] 
    remote = private 
    merge = refs/heads/mybranch 

nếu có một cách để cải thiện điều này xin vui lòng bình luận

Trả lời

14

Để an toàn, bạn có thể thêm git attribute (xem here for an example) cho các tệp riêng tư đó. Bằng cách đó, bạn có thể xác định một tập lệnh (một "trình quản lý hợp nhất") sẽ đảm bảo tệp bao gồm thông tin cá nhân sẽ vẫn trống (hoặc có nội dung công khai) nếu được hợp nhất trên nhánh công cộng, trong khi vẫn giữ nội dung cục bộ của nó sáp nhập vào chi nhánh tư nhân.
Điều đó có nghĩa là bạn có thể hợp nhất/rebase mà không cần suy nghĩ về tệp đó.

+0

hoạt động, cảm ơn! – Evgeny

+1

Điều này chỉ hoạt động khi tệp được thay đổi trong cả hai nhánh. Khi hợp nhất được giải quyết với keepmine, việc hợp nhất sau trong nhánh khác sẽ giải quyết bằng cách recurse. – f3r3nc

2

Giữ mật khẩu dưới sự kiểm soát phiên bản là ý tưởng tồi tệ nhất bao giờ hết. Bạn cần CVS, chứ không phải git, để làm việc với các tệp riêng biệt. Git như nhiều DVCS hiện đại khác làm việc với toàn bộ cây, không phải với các tệp riêng biệt.

+0

chắc chắn, nhưng mật khẩu là điểm nhỏ ở đây. – Evgeny

3

Một cách để thực hiện việc này là với git rebase. Bằng cách giữ các thay đổi riêng tư của bạn dưới dạng một vài cam kết ở cuối số master, bạn có thể chuyển công cụ tới chi nhánh master (hoặc bất kỳ thứ gì bạn chọn nhánh đang hoạt động), và sau đó rebase nhánh riêng của bạn với master khi bạn muốn cập nhật .

Một cách khác để xử lý việc này là giữ các tệp cấu hình mẫu trong Git, chẳng hạn như frobozz.config.template. Trong thư mục làm việc của bạn, sao chép frobozz.config.template vào (không phiên bản) frobozz.config và sửa đổi. Chỉ cần chắc chắn để sao lưu thư mục làm việc của bạn quá, nếu bạn cần thay đổi địa phương của bạn để được sao lưu.

3

Điều này dường như chỉ hoạt động nếu có xung đột hợp nhất được phát hiện. Hợp nhất qua lại giữa các nhánh mà tệp bị ghi đè. Trừ khi tôi thiết lập một cái gì đó sai. Tất nhiên điều này trong trên windows msysgit git phiên bản 1.6.5.1.1367.

+0

@yoyodyn có, bạn nói đúng điều này chỉ hoạt động trên các tệp có xung đột hợp nhất. – Evgeny

+0

bạn cũng có thể cân nhắc việc sáp nhập chỉ một cách từ công khai sang riêng tư, nhưng trong trường hợp này bạn sẽ phải giữ kỷ luật - chỉ phát triển các tính năng công khai trên nhánh/kho công khai – Evgeny

+0

Điều tôi thực sự có là ba bản sao của cùng một repo tại các vị trí địa lý khác nhau. Văn phòng của chúng tôi hoạt động trong nhánh chính, một trang web khác hoạt động trong nhánh thử nghiệm để khách hàng có thể thực hiện QA và nhánh thứ ba là chi nhánh sản xuất nơi mã hiện đang chạy. Chúng tôi có ít nhất một tệp Macros.h mà chúng tôi đưa vào rất nhiều dự án c + + chứa các giá trị khác nhau cho các macro tùy thuộc vào chủ nhân, thử nghiệm hoặc sản xuất của macro. Tôi đã cố gắng tìm một cách để ngăn chặn các tập tin macros.h từ việc sáp nhập giữa các chi nhánh. – yoyodyn

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