Git - Bỏ qua các tệp trong khi hợp nhất


115

Tôi có một repo được gọi myrepotrên beanstalkmáy chủ từ xa .

Tôi đã nhân bản nó vào máy cục bộ của mình. Đã tạo hai nhánh bổ sung: stagingdev. Đẩy các nhánh này sang điều khiển từ xa.

Hiện nay:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

Tôi có một tệp được gọi là tệp config.xmlkhác nhau trên mỗi nhánh.

Tôi chỉ muốn bỏ qua tệp này trong khi hợp nhất. Nhưng tôi muốn điều này được bao gồm khi tôi thanh toán hoặc cam kết từ / đến chi nhánh repo.

Lý do tôi muốn điều này là, chúng tôi có một tập lệnh triển khai kéo (kiểm tra) chi nhánh cụ thể và triển khai trên các máy chủ tương ứng. Vì vậy, chúng tôi cần config.xmltệp của nhánh cụ thể đó đi vào máy chủ cụ thể như đã chỉ ra ở trên khi triển khai.

Tôi đoán .gitignoresẽ không hoạt động. các tùy chọn khác là gì? Lưu ý rằng tệp bị bỏ qua phải là một phần của kiểm tra và cam kết, điều này rất quan trọng. nó chỉ nên được bỏ qua trong khi hợp nhất.

Cảm ơn!


Trong chế độ mặc định của nó, git pull là viết tắt của git fetch, sau đó là git merge FETCH_HEAD. Vì vậy, bạn tuyên bố loại xung đột với nhau.
zzk

Vâng, tôi sẽ nói, thanh toán của nó. Không kéo. Tôi sẽ cập nhật câu hỏi để được rõ ràng.
Kevin Rave


2
Bạn đã bao giờ tìm thấy một giải pháp cho điều này? Các thuộc tính git chỉ hữu ích trong trường hợp tệp có xung đột giữa các nhánh được hợp nhất, vì vậy không phải lúc nào tệp cũng đủ.
pvinis

bạn đã xem xét biểu tượng (không theo sau bởi git) hoặc thậm chí liên kết cứng để giải cứu?
Frank Nocke

Câu trả lời:


94

Tôi đã khắc phục sự cố này bằng cách sử dụng lệnh git merge với --no-committùy chọn và sau đó xóa tệp theo giai đoạn một cách rõ ràng và bỏ qua các thay đổi đối với tệp. Ví dụ: nói rằng tôi muốn bỏ qua bất kỳ thay đổi nào đối với myfile.txttôi, tôi tiến hành như sau:

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

Bạn có thể đặt câu lệnh 2 & 3 trong vòng lặp for, nếu bạn có danh sách các tệp cần bỏ qua.


2
Tôi sẽ thêm "--no-ff" nếu bạn muốn tệp không bị ghi đè khi hợp nhất diễn ra trong chiến lược tua đi nhanh.
Ilia Shakitko

1
Vì vậy, những gì git reset HEAD myfile.txtlàm chính xác? Nó giúp gì cho mục tiêu của chúng ta ở đây?
Kid_Learning_C

Làm thế nào để bạn đặt dòng 2 và 3 trong một vòng lặp?
AndroidDev

52

Tôi đã tìm thấy git attributes. Đang thử nó. Làm việc cho đến nay. Chưa kiểm tra tất cả các tình huống. Nhưng nó phải là giải pháp.

Chiến lược hợp nhất - Thuộc tính Git


4
nhưng tôi đã tìm thấy git-scm.com/book/ch7-2.html#Merge-Strategies
Nate-

1
Dưới đây là liên kết chính xác cho phần chiến lược hợp nhất của git thuộc tính tài liệu: git-scm.com/book/en/v2/...
Adrian Laurenzi

3
Tìm thấy điều này được giải thích rõ ràng trong một bài báo medium.com/@porteneuve/…
ShawnFeatherly Ngày

10
Đây dường như là một vấn đề nếu không có xung đột? Các tệp vẫn sẽ được hợp nhất?
Brett

18

.gitattributes - là một tệp cấp cơ sở của kho lưu trữ của bạn để xác định các thuộc tính cho một thư mục con hoặc tập hợp con của các tệp.

Bạn có thể chỉ định thuộc tính để yêu cầu Git sử dụng các chiến lược hợp nhất khác nhau cho một tệp cụ thể. Ở đây, chúng tôi muốn giữ nguyên hiện có config.xmlcho chi nhánh của chúng tôi. Chúng tôi cần phải đặt merge=oursđể config.xmltrong .gitattributestập tin.

merge=ours yêu cầu git sử dụng tệp (chi nhánh hiện tại) của chúng tôi, nếu xung đột hợp nhất xảy ra.

  1. Thêm .gitattributestệp ở cấp cơ sở của kho lưu trữ

  2. Bạn có thể thiết lập một thuộc tính cho confix.xml trong .gitattributestệp

    config.xml merge=ours
    
  3. Và sau đó xác định chiến lược hợp nhất giả của chúng tôi với:

    $ git config --global merge.ours.driver true
    

Nếu bạn hợp nhất nhánh của stagbiểu mẫu dev, thay vì có xung đột hợp nhất với tệp config.xml, config.xml của nhánh trì hoãn ở bất kỳ phiên bản nào bạn có ban đầu.


16
Nhưng nếu không có xung đột thì sao? Làm thế nào để luôn giữ một tệp nhất định trong quá trình hợp nhất?
Igor Yalovoy

2
@IgorYalovoy: Nếu không có xung đột ... tốt, đây là một chút khó khăn vì nó thực sự hoạt động từ ID băm, nhưng: nếu config.xmlhoàn toàn không thay đổi từ cơ sở hợp nhất cho một trong hai phiên bản đầu chi nhánh, Git chỉ mất phiên bản thay đổi, mà không nhìn vào merge.ours.driverthiết lập. Vì vậy, bạn là chính xác để được quan tâm.
torek

1
copy-paste từ Git Docs: Merge Strategies - Git. Liên kết
kyb

Phương pháp này dẫn đến "các cam kết hợp nhất" mỗi khi FYI.
rsmets

2
"của chúng tôi" dường như là một tên tùy ý cho chiến lược mới đang được giới thiệu. Tôi thấy điều này khó hiểu, bởi vì đây theirslà một chiến lược hợp nhất được tích hợp sẵn. Nhưng dường như người ta có thể viết <pattern> merge=foo, sau đógit config --global merge.foo.driver true , và nó sẽ làm việc cùng một cách.
Kyle Strand

8

Bạn có thể bắt đầu bằng cách sử dụng git merge --no-commit, sau đó chỉnh sửa hợp nhất theo cách bạn muốn, tức là bằng cách hủy phân đoạn config.xmlhoặc bất kỳ tệp nào khác, sau đó cam kết. Tôi nghi ngờ rằng bạn muốn tự động hóa nó hơn nữa sau đó bằng cách sử dụng hook, nhưng tôi nghĩ rằng nó đáng để thực hiện thủ công ít nhất một lần.


2
git attributesđưa ra bất kỳ giải pháp thẳng thắn nào không? Tôi không thể hiểu điều này. git-scm.com/book/en/…
Kevin Rave

4

Bạn có thể sử dụng .gitignoređể loại config.xmlbỏ kho lưu trữ, sau đó sử dụng móc đăng ký để tải tệp thích hợp config.xmllên máy chủ.


1
Tôi biết đó là loại hack. Tôi đang cố gắng tìm ra một giải pháp sạch. Còn về git attributes. Bất kỳ ý tưởng làm thế nào nó hoạt động? Tôi không thể hiểu điều này. git-scm.com/book/en/…
Kevin Rave

1
Tôi chưa nghe nói về những điều này, tôi đang cố gắng áp dụng thuộc tính merge = our, có vẻ đầy hứa hẹn.
tlehman

1
Thuộc tính Git thật tuyệt vời! Bạn thậm chí có thể cho git biết cách khác biệt các tệp không phải văn bản, vì vậy bạn có thể sử dụng pdf2text để khác các tệp PDF!
tlehman

2

Thí dụ:

  1. Bạn có hai nhánh: master ,develop
  2. Bạn đã tạo tệp trong developnhánh và muốn bỏ qua tệp đó trong khi hợp nhất

Mã:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

Bạn cũng có thể bỏ qua các tệp có cùng phần mở rộng

ví dụ: tất cả các tệp có .txtphần mở rộng:

echo "*.txt merge=ours" >> .gitattributes

1

Đây git-update-index - Đăng ký nội dung tệp trong cây làm việc vào chỉ mục.

git update-index --assume-unchanged <PATH_OF_THE_FILE>

Thí dụ:-

git update-index --assume-unchanged somelocation/pom.xml


Điều đó tốt khi đẩy nhưng vẫn phàn nàn khi kéo có thể ghi đè lên tệp.
Rolf

1
bạn đã thử thêm mục nhập tệp của mình vào tệp .gitignore chưa. @Rolf
Sireesh Yarlagadda
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.