git: bản vá không áp dụng


289

Tôi có một bản vá nhất định được gọi là my_pcc_branch.patch.

Khi tôi cố gắng áp dụng nó, tôi nhận được thông báo sau:

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply

Nó có nghĩa là gì?

Làm thế nào tôi có thể khắc phục vấn đề này?


Có bất kỳ tập tin AbstractedPanel.java.rej nào nằm xung quanh không? Điển hình điều này có nghĩa là một bot dòng đã thay đổi trong nguồn cũng như trong bản vá (ở đây dòng 13 dường như bị ảnh hưởng).
Rudi

Không, tôi không tìm thấy bất kỳ tệp * .rej nào.
Dmitrii Pisarenko

Không chắc chắn tại sao câu trả lời được chấp nhận sẽ khắc phục nó (vì vậy tôi nghi ngờ đó là cá trích đỏ), nhưng không has type 100644, expected 100755ngụ ý có quyền chmod không khớp ở đâu đó?
ruffin

Câu trả lời:


325

git apply --reject --whitespace=fix mychanges.patch đã làm cho tôi.

Giải trình

Các --rejecttùy chọn sẽ hướng dẫn git để không thất bại nếu nó không thể xác định làm thế nào để áp dụng một bản vá, nhưng thay vì áp dụng hunks indivdual nó có thể áp dụng và tạo bác bỏ các file ( .rej) cho hunks nó không thể được áp dụng. Wiggle có thể "áp dụng [những] bản vá bị từ chối và thực hiện các từ khác nhau".

Ngoài ra, --whitespace=fixsẽ cảnh báo về các lỗi khoảng trắng và cố gắng sửa chúng, thay vì từ chối áp dụng một hunk áp dụng khác.

Cả hai tùy chọn cùng nhau làm cho ứng dụng của một bản vá mạnh mẽ hơn chống lại thất bại, nhưng chúng đòi hỏi sự chú ý bổ sung liên quan đến kết quả.

Để biết toàn bộ tài liệu, hãy xem https://git-scm.com/docs/git-apply .


8
Điều này thực sự hiệu quả với tôi hơn vì nó không sửa đổi hoàn toàn tệp của tôi
Wayne Werner

10
Điều đó thật tuyệt. Chỉ cần từ chối những gì nó không thể tự giải quyết và sau đó bạn có thể sửa đổi các tệp bị từ chối theo cách thủ công.
Dennis

1
patch -p1 <mychanges.patch # áp dụng thay đổi từng phần một. Nếu các thay đổi không thành công, bản vá <sourcefile> .orig và <sourcefile> .rej được tạo và bạn có thể áp dụng các thay đổi theo cách thủ công. Tôi đoán git áp dụng --reject cũng làm như vậy và --whitespace = fix tốt hơn một cách kỳ diệu.
gaoithe

7
lệnh này tạo .rejtập tin khi không thể tự động phát hiện cách áp dụng bản vá. Bạn có thể sử dụng lung để giải quyết các vấn đề như vậy.
goodniceweb

14
Câu trả lời này không giải thích bất cứ điều gì, đặc biệt trong trường hợp nào nó sẽ hoạt động. Mọi người, bạn thực sự phải đòi hỏi nhiều hơn về chất lượng câu trả lời, đây không phải là một diễn đàn.
Oliver

319

Julian Sixt từ danh sách gửi thư msysgit@googlegroups.com được đề xuất sử dụng các đối số dòng lệnh sau:

git apply --ignore-space-change --ignore-whitespace mychanges.patch

Điều này đã giải quyết vấn đề của tôi.


25
Bất cứ ai có thể giúp tôi và giải thích tại sao điều này làm việc? Câu trả lời khác không phù hợp với tôi và tôi có cùng một vấn đề giống như những gì người hỏi đặt ra. Các thuộc tính tệp phải làm gì với việc bỏ qua khoảng trắng?
skrebbel

1
Sử dụng windows powershell Một bản vá được tạo bằng git diff đã được áp dụng thành công như sau: git diff HEAD..613fee - myfile.xml | git áp dụng --ignore-gian-change --ignore-trắng, trong khi đó đầu tiên lưu lượng khác như một tập tin đã không làm việc, trong trường hợp bất cứ ai chạy vào cùng một vấn đề
tjb

2
cũng thử -C1chuyển đổi để áp dụng, nó làm giảm bối cảnh xung quanh các bổ sung được coi là quan trọng.
Amir Ali Akbari

2
@EricWalker, phép thuật git với CR / LF không hẳn là điều xấu. Thay thế có thể là một nửa số thay đổi của bạn bao gồm mỗi dòng trong mỗi tệp được chạm vào được thay đổi từ dòng này kết thúc sang dòng khác, với thay đổi thực tế được chôn ở đâu đó ở giữa.
jwg

3
Điều này đôi khi giúp. Nhưng những lần khác, tôi vẫn nhận được "bản vá không áp dụng", mặc dù bản vá sẽ được áp dụng mà không gặp vấn đề gì.
Thomas Levesque

118

Khi vẫn thất bại, hãy thử git apply's --3waylựa chọn .

git apply --3way patchFile.patch

--3way
Khi bản vá không được áp dụng sạch, hãy quay lại hợp nhất 3 chiều nếu bản vá ghi lại danh tính của các đốm màu mà nó được áp dụng và chúng tôi có các đốm màu đó có sẵn tại địa phương, có thể để lại các dấu xung đột trong các tệp trong cây làm việc để người dùng giải quyết. Tùy chọn này ngụ ý tùy chọn --index và không tương thích với các tùy chọn --reject và --cached.

Trường hợp thất bại điển hình áp dụng càng nhiều bản vá càng tốt và để lại cho bạn các xung đột để giải quyết trong git tuy nhiên bạn thường làm như vậy. Có lẽ một bước dễ dàng hơn so với rejectthay thế.


2
Đây là câu trả lời làm việc cho tôi. Tệp tôi đang vá không phản ánh các thay đổi mà tôi đã tạo bản vá từ đó (vì tôi đã xóa các thay đổi sau khi tôi tạo bản vá.)
Christia

3
Giải pháp chung đẹp. Khác biệt 3way trông không giống như bình thường một chút bối rối bởi điều đó nhưng không bao giờ điều này cho tôi khả năng giải quyết xung đột và áp dụng bản vá.
steinybot

8
Tôi nghĩ rằng đây --3waynên là hành vi mặc định. Khi vá lỗi thất bại, ít nhất hãy cho tôi biết những gì không thành công để tôi có thể tự sửa nó. git applychỉ thất bại và không báo cáo lý do tại sao một cái gì đó thất bại. Tôi thậm chí không thể tìm thấy *.rejcác tập tin như những người hgtạo ra.
Pavan Manjunath

4
Chắc chắn, giải pháp tốt nhất. Hãy để người dùng giải quyết xung đột của chính mình!
Mosh Feu

56

Lệnh này sẽ áp dụng bản vá không giải quyết nó để lại các tệp xấu như *.rej:

git apply --reject --whitespace=fix mypath.patch

Bạn chỉ cần giải quyết chúng. Sau khi giải quyết xong:

git -am resolved

7
cách giải quyết *.rej- tất cả những gì tôi có thể tìm thấy là thực hiện các thay đổi theo cách thủ công trong tệp nguồn & xóa các .rejtệp này . Bất kỳ cách nào khác ?
mã hóa_idiot

1
@coding_idiot Như thường lệ, chỉ cần kiểm tra các tệp .rej, so sánh chúng với các tệp xung đột và cuối cùng thêm các tệp cố định vào chỉ mục (với "git add FIXED_FILES")
Ivan Voroshilin

2
@coding_idiot bạn có thể sử dụng lung để giải quyết nó. Ví dụ : wiggle --replace path/to/file path/to/file.rej. Lệnh này sẽ áp dụng các thay đổi từ .rejtệp này sang tệp gốc. Ngoài ra, nó tạo ra một bản sao của tập tin gốc, như path/to/file.porig. Xin vui lòng, kiểm tra tài liệu để có thêm thông tin về lung lay
goodniceweb

22

Hãy thử sử dụng giải pháp được đề xuất tại đây: https://www.drupal.org/node/1129120

patch -p1 < example.patch

Điều này đã giúp tôi.


3
Tôi biết bạn không cần phải làm điều này, nhưng CẢM ƠN BẠN RẤT NHIỀU! Tiết kiệm cho tôi hàng giờ. Tôi đã nhận được "bản vá không áp dụng" và tất cả các loại lỗi.
sudo rm -rf chém

@ sudorm-rfslash, tại sao chúng ta không được phép làm điều này và tại sao bạn vẫn làm điều đó?
Đen

git: 'patch' is not a git command.vàogit version 2.21.1 (Apple Git-122.3)
Sridhar Sarnobat

16

Điều này xảy ra khi bạn trộn các máy khách git UNIX và Windows vì Windows không thực sự có khái niệm về bit "x" để việc kiểm tra rw-r--r--tệp (0644) trong Windows được "quảng bá" bởi lớp POSIX msys là rwx-r-xr-x(0755) . git coi sự khác biệt về chế độ về cơ bản giống như sự khác biệt về văn bản trong tệp, do đó bản vá của bạn không được áp dụng trực tiếp. Tôi nghĩ rằng lựa chọn tốt duy nhất của bạn ở đây là đặt core.filemodethành false(sử dụng git-config).

Đây là sự cố msysgit với một số thông tin liên quan: http://code.google.com.vn/p/msysgit/issues/detail?id=164 (được gửi lại tới bản sao lưu trữ ngày 3 tháng 12 năm 2013 của archive.org)


2
Tôi đã cố chạy lệnh "git config core.filemode false", nhưng không được - tôi vẫn nhận được thông báo tương tự.
Dmitrii Pisarenko

Giả sử bạn không có thay đổi không cam kết trong cây của mình, hãy thử git reset --hard HEADbuộc git kiểm tra lại các tệp của bạn với tùy chọn mới có hiệu lực.
Ben Jackson

Chỉ cần thử nó thực hiện "git reset --hard HEAD". Nó đã thành công (tôi thấy thông báo "ĐẦU bây giờ là ..."), nhưng vấn đề với "git áp dụng" vẫn tồn tại.
Dmitrii Pisarenko

7

Trong trường hợp của tôi, tôi đã đủ ngu ngốc để tạo tệp vá không chính xác ngay từ đầu, thực sự khác với cách sai . Tôi đã kết thúc với các thông báo lỗi chính xác tương tự.

Nếu bạn git diff branch-name > branch-name.patchthành thạo và thực hiện , điều này sẽ cố gắng loại bỏ tất cả các bổ sung bạn muốn xảy ra và ngược lại (điều mà git không thể thực hiện được vì rõ ràng, không bao giờ thực hiện bổ sung không thể bị xóa).

Vì vậy, hãy chắc chắn rằng bạn kiểm tra chi nhánh của bạn và thực hiện git diff master > branch-name.patch


3

CẢNH BÁO: Lệnh này có thể loại bỏ các cam kết cũ bị mất vĩnh viễn. Tạo một bản sao của toàn bộ kho lưu trữ của bạn trước khi thử điều này.

Tôi đã tìm thấy liên kết này

Tôi không biết tại sao điều này hoạt động nhưng tôi đã thử nhiều công việc xung quanh và đây là người duy nhất làm việc cho tôi. Nói tóm lại, hãy chạy ba lệnh dưới đây:

git fsck --full
git reflog expire --expire=now --all
git gc --prune=now

3
Đây là một lệnh rất nguy hiểm có thể loại bỏ các cam kết cũ bị mất mãi mãi khỏi reflog. Nếu repo của bạn ở trạng thái rung lắc, KHÔNG ÁP DỤNG NÀY.
ET

0

Những gì tôi tìm kiếm không được chỉ ra chính xác ở đây trong SO, tôi đang viết vì lợi ích của những người khác có thể tìm kiếm tương tự. Tôi gặp phải một vấn đề với một tập tin (hiện diện trong repo cũ) bị xóa trong repo. Và khi tôi áp dụng bản vá, nó thất bại vì không thể tìm thấy tệp được áp dụng. (vì vậy trường hợp của tôi là git patch không thành công cho tệp đã bị xóa) '#git áp dụng --reject' chắc chắn đã đưa ra một quan điểm nhưng không hoàn toàn khiến tôi phải sửa chữa. Tôi không thể sử dụng lắc lư vì nó không có sẵn cho chúng tôi trong các máy chủ xây dựng của chúng tôi. Trong trường hợp của tôi, tôi đã khắc phục được sự cố này bằng cách xóa mục nhập 'tệp đã bị xóa trong repo' khỏi tệp vá tôi đã thử áp dụng, vì vậy tôi đã áp dụng tất cả các thay đổi khác mà không gặp sự cố (sử dụng hợp nhất 3 cách, tránh lỗi khoảng trắng), và sau đó kết hợp thủ công nội dung của tệp được xóa vào nơi di chuyển.


0

Vấn đề của tôi là tôi đã chạy git diff, sau đó chạy git reset --hard HEAD, sau đó nhận ra rằng tôi muốn hoàn tác, vì vậy tôi đã thử sao chép đầu ra từ git diffmột tệp và sử dụng git apply, nhưng tôi đã gặp một lỗi "bản vá không áp dụng". Sau khi chuyển sang patchvà cố gắng sử dụng nó, tôi nhận ra rằng một đoạn khác biệt được lặp đi lặp lại vì một số lý do và sau khi loại bỏ trùng lặp , patch(và có lẽ cũng vậy git apply) đã hoạt động.

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.