Làm cách nào để áp dụng bản vá khác trên Windows?


136

Có rất nhiều chương trình có thể tạo ra một bản vá khác nhau, nhưng tôi có một chút thời gian cố gắng áp dụng một chương trình. Tôi đang cố gắng phân phối một bản vá và tôi đã nhận được câu hỏi từ người dùng về cách áp dụng nó. Vì vậy, tôi đã cố gắng tự mình tìm ra và phát hiện ra rằng tôi không có đầu mối, và hầu hết các công cụ tôi có thể tìm thấy là dòng lệnh. (Tôi có thể xử lý một dòng lệnh, nhưng nhiều người sẽ bị mất nếu không có GUI thân thiện, đẹp. Vì vậy, những thứ đó không tốt cho mục đích này.)

Tôi đã thử sử dụng TortoiseSVN. Tôi có bản vá tôi muốn áp dụng. Tôi nhấp chuột phải vào bản vá và có một tùy chọn trong menu con TortoiseSVN có nội dung "Áp dụng bản vá". Tất cả những gì nó làm là kéo lên một cửa sổ trống.

Vì vậy, tôi đã thử nhấn Open. Nó có hai tùy chọn: hợp nhất và áp dụng khác biệt thống nhất. (May mắn là bản vá có định dạng khác nhau, may mắn thay.) Nhưng tùy chọn áp dụng chỉ đơn giản là không hoạt động: Nó yêu cầu bản vá và thư mục. Bằng cách nào đó nó quên yêu cầu các tập tin để áp dụng các bản vá cho! Vì vậy, TortoiseSVN chỉ đơn giản là không hoạt động. Có tiện ích dựa trên GUI Windows nào sẽ lấy một bản vá và tệp và áp dụng đúng cách không?

EDIT: Nhìn vào các câu trả lời cho đến nay, có vẻ như Rùa sẽ chỉ làm đúng nếu đó là một tệp đã được phiên bản. Đó không phải là trường hợp ở đây. Tôi cần có khả năng áp dụng một bản vá cho một tệp không ra khỏi kho SVN. Tôi mới thử sử dụng Rùa, vì tôi tình cờ biết rằng SVN sử dụng diffs và phải biết cách tạo cả hai và áp dụng chúng.


Câu trả lời của WinMerge nghe có vẻ hay nhưng chỉ giải thích cách tạo một bản vá chứ không phải cách áp dụng. TortoiseHG có một cách tuyệt vời để áp dụng các bản vá, nhưng chỉ với các tệp trong một repo hg, theo như tôi biết. Nếu rùa SVN bên ngoài không thể làm điều đó, tôi tự hỏi liệu có công cụ GUI nào có thể không.
Warren P

3
Ồ, bạn đúng, câu trả lời ngắn vẫn là không - ít nhất là trong WinMerge. Yêu cầu tính năng trên WinMerge tại đây sourceforge.net/tracker/ Từ
KCD

Câu trả lời:


32

Áp dụng bản vá

Với TortoiseMerge:

  1. Tìm và mở một thư mục repo SVN hiện có
  2. Tạo một thư mục mới có tên là "sáp nhập", nếu nó chưa tồn tại
  3. Sao chép tệp mà bạn muốn áp dụng tệp .patch
  4. THÊM VÀ CAM KẾT vào kho svn trước khi bạn tiếp tục bước tiếp theo
  5. Nhấp chuột phải vào sáp nhập và chọn Áp dụng bản vá ...
  6. Nhấp đúp chuột vào tập tin từ danh sách
  7. Các tập tin vá với diff được hiển thị trên khung bên phải
  8. Nhấp vào khung đó và nhấn Lưu hoặc xuất bằng Tệp-> Lưu dưới dạng ...

Màn hình thay thế nếu bạn mở từ TortoiseMerge. Trong màn hình bên dưới, thư mục đề cập đến thư mục "hợp nhất" được đề cập ở bước 2 ở trên: Sàng lọc

Ảnh chụp màn hình của WinMerge GUI: Sàng lọc


@WarrenP: vâng, nó giải thích cách áp dụng bản vá bằng TortoiseMerge
Walter Stabosz

4
Nhận xét của tôi có ý nghĩa trước khi chỉnh sửa, và không còn ý nghĩa sau khi chỉnh sửa. Bạn bối rối chưa? Dấu thời gian chỉnh sửa ở trên (mar 24, '11) dường như không chính xác, vì OP đã chỉnh sửa lại câu trả lời của anh ấy kể từ tháng 10 năm 2011. Tôi nghĩ rằng dấu thời gian trên nhận xét của tôi cũng sai.
Warren P

9
@SheriffMd Bạn không nhận được lỗi "D: \ Thư mục không phải là bản sao hoạt động"?
onmyway133

1
@SheriffMd Tôi cũng nhận được thông báo "thư mục ... không phải là bản sao hoạt động" - vì vậy, làm thế nào có thể sử dụng kết hợp rùa để áp dụng một bản vá cho tệp không có phiên bản?
Peter T.

1
@ onmyway133, tôi đã đọc lại các bước. Tham khảo Bước 2 và Bước 4. Bạn sẽ không nhận được thông báo lỗi "không phải là bản sao hoạt động".
Cảnh sát trưởng Md

21

Tôi đã tạo ra công cụ Python thuần túy chỉ vì điều đó. Nó có hành vi đa nền tảng dự đoán. Mặc dù nó không tạo các tệp mới (tại thời điểm viết này) và thiếu GUI, nhưng nó có thể được sử dụng làm thư viện để tạo công cụ đồ họa.

CẬP NHẬT : Sẽ thuận tiện hơn khi sử dụng nó nếu bạn đã cài đặt Python.

pip install patch
python -m patch

1
Tôi sử dụng nó rất nhiều. Cảm ơn @techtonik. Có tin tức gì về việc nó hoạt động với Python3 không?
pelson

Chạy pip cài đặt bản vá với quyền quản trị để đảm bảo nó hoạt động.
Vertexwahn 15/03/2016

@Vertexwahn có trên Linux không?
anatoly techtonik 17/03/2016

Python chạy khắp mọi nơi - Tôi đã thử nghiệm nó với Windows 10
Vertexwahn 17/03/2016

Hoạt động trên Windows 10 khi git patch không hoạt động. Cảm ơn bạn!
sqrl0

19

TortoiseMerge là một tiện ích riêng biệt đi kèm với TortoiseSVN.

Nó cũng có thể được tải xuống riêng trong kho lưu trữ TortoiseDiff.zip . Điều này sẽ cho phép bạn áp dụng các khác biệt thống nhất cho các tệp không có phiên bản.


21
AFAIK điều này không thể áp dụng bản vá trên một tệp không có phiên bản.
pieaveragy

Tôi không gặp vấn đề gì khi áp dụng nó vào một tệp không có phiên bản.
Paul Shannon

những người khác muốn: S.
UmNyobe

1
Phiên bản 1.8.7 đưa ra lỗi về số phận không được phiên bản.
Nick Westgate

15

Tôi biết bạn nói rằng bạn sẽ thích GUI, nhưng các công cụ dòng lệnh sẽ thực hiện công việc tốt. Xem GnuWin để biết cổng công cụ unix cho Windows. Bạn sẽ cần lệnh vá, rõ ràng ;-)

Tuy nhiên, bạn có thể gặp vấn đề với việc chấm dứt dòng. Cổng GnuWin sẽ cho rằng patchfile có chấm dứt dòng kiểu DOS (CR / LF). Hãy thử mở patchfile trong một trình soạn thảo hợp lý thông minh và nó sẽ chuyển đổi nó cho bạn.


Vâng đặt. Sẽ không thể tìm ra vấn đề chấm dứt dòng mà không có nhận xét này.
Bryan

Một cách khác để đối phó với các kết thúc dòng là thêm tùy chọn "--binary" vào dòng lệnh.
BeReal82

4
Đây là những gì đã đưa tôi đi đúng hướng. Tuy nhiên, chạy Windows 7 hoặc mới hơn, bạn cần cập nhật bảng kê khai của patch.exe để tránh việc bật lên UAC mỗi lần. Xem trang này để biết cách thực hiện: math.nist.gov/oommf/software-patchsets/patch_on_Windows7.html
Anttu

1
Ngay cả với các bản sửa lỗi UAC, phiên bản vá GnuWin làm rối các cài đặt bảo mật tệp. Bản dựng được vận chuyển với git không gặp phải vấn đề nào.
Artfunkel 7/03/2016

8

Trong TortoiseSVN, áp dụng bản vá không hoạt động. Bạn cần áp dụng bản vá cho cùng thư mục như nó được tạo từ đó . Nó luôn luôn quan trọng để ghi nhớ điều này. Vì vậy, đây là cách bạn làm điều đó trong TortoiseSVN:

Nhấp chuột phải vào thư mục bạn muốn áp dụng bản vá. Nó sẽ hiển thị một hộp thoại yêu cầu vị trí của tệp vá. Chọn tệp và điều này sẽ mở ra một cửa sổ danh sách tệp nhỏ liệt kê các tệp đã thay đổi và nhấp vào từng mục sẽ mở một cửa sổ khác để hiển thị những gì bản vá sắp làm với tệp đó.

Chúc may mắn.


8
Điều đó không có ích. Các tệp đích không xuất phát từ kho lưu trữ SVN. (Xem phần chỉnh sửa bài đăng gốc.)
Mason Wheeler

8

Tiện ích patch.exe từ bản cài đặt Git hoạt động trên Windows 10.

Cài đặt Git cho Windows sau đó sử dụng "C:\Program Files\Git\usr\bin\patch.exe"lệnh để áp dụng bản vá.

Nếu có bất kỳ thông báo lỗi nào như Hunk #1 FAILED at 1 (different line endings).đã xuất hiện ở đầu ra trong khi áp dụng bản vá, hãy thử thêm -l(đó là lối tắt cho --ignore-whitespace) hoặc các --binarycông tắc vào dòng lệnh.


Câu hỏi này chủ yếu là về một công cụ GUI cho người dùng thông thường không quen thuộc với các công cụ dòng lệnh thông thường. Câu trả lời của bạn sẽ hữu ích hơn nếu bạn ít nhất cung cấp một số lệnh mẫu đầy đủ làm ví dụ.
Álvaro González

Làm việc với nhà soạn nhạc trong Windows 10.
ecdani 14/12/18

7

Bạn có thể sử dụng cổng gốc Win32 này của tiện ích vá lỗi.

Nó đi kèm với một lựa chọn lớn hơn các tiện ích khác và ngược lại với Cygwin và tương tự, nó không cần bất kỳ DLL hoặc tương tự. Chỉ cần chọn thực thi nhỏ của bạn và lưu trữ nó bất cứ nơi nào bạn muốn.

Cách sử dụng đơn giản:

patch.exe -i <patchfile>

Nhận thêm trợ giúp:

patch.exe --help

4
Tôi gặp sự cố với điều này trên Windows 7: nó mở một cửa sổ CMD mới và nhắc nhở các đặc quyền quản trị khi tôi cố chạy patch.exe.
Roy Tinker

3
Bản vá thực thi cũng có thể được tìm thấy trong gói Git cho Windows.
Snicksie

6
Nếu bạn đang gặp vấn đề khi chạy patch.exe, bạn có thể đổi tên nó thành bất kỳ thứ gì không bao gồm patch. Windows coi tất cả các exes với từ patchbị nghi ngờ.
wbond

2

EDIT: Nhìn vào các câu trả lời cho đến nay, có vẻ như Rùa sẽ chỉ làm đúng nếu đó là một tệp đã được phiên bản. Đó không phải là trường hợp ở đây. Tôi cần có khả năng áp dụng một bản vá cho một tệp không ra khỏi kho SVN. Tôi mới thử sử dụng Rùa vì tôi tình cờ biết rằng SVN sử dụng diffs và phải biết cách tạo cả hai và áp dụng chúng.

Bạn có thể cài đặt Cygwin , sau đó sử dụng công cụ dòng lệnh để áp dụng bản vá. Xem thêm trang người dùng Unix này , áp dụng cho bản vá .


4
Vâng, tôi có thể. Tôi đã có Cygwin, trên thực tế. Tôi có thể có thể làm cho giải pháp của bạn làm việc, quá. Mặc dù vậy, tôi sẽ không đưa người dùng của mình vượt qua điều đó. Bạn có biết bao nhiêu người dùng Windows ngày nay thậm chí không biết dòng lệnh là gì không? : P
Mason Wheeler

2

Dường như TortoiseSVN (TortoiseMerge) yêu cầu dòngIndex: foobar.py trong tệp diff / patch. Đây là những gì tôi cần phải làm gì để làm cho một tổ chức phi TortoiseSVN file patch làm việc với nhấp chuột phải TortoiseSVN của Apply patch lệnh.

Trước:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

Sau:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

Hoặc nếu bạn biết bản sửa đổi cụ thể mà cộng tác viên của bạn đã làm việc từ:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)

2

Tôi sử dụng MSYS2 từ http://www.msys2.org/

Nó cung cấp nhiều tiện ích như patch, which, git, tree, và nhiều hơn nữa.

Sau khi cài đặt MSYS2, chỉ cần chạy trình quản lý gói để cài đặt patch:

pacman -S patch

Đây chỉ là một cách phức tạp để cài đặt một công cụ dòng lệnh. Tôi nghi ngờ bạn chỉ đọc tiêu đề câu hỏi và không phải chính câu hỏi. :)
Álvaro González

1

Các bản vá cho nó biết những gì để áp dụng tập tin. Tiêu đề phải giống như (xem nó trong Notepad hoặc trình soạn thảo văn bản fav của bạn):

--- Folder/old_file
+++ Folder/new_file

Trong trường hợp bản vá Subversion, bạn cũng sẽ có số sửa đổi (vì tên tệp giống nhau).

Bản vá GNU sẽ cho phép bạn ghi đè các tên đó, nhưng tôi không biết bất kỳ công cụ GUI nào để làm như vậy. Tôi sẽ kiểm tra với các chương trình khác nhau - mặc dù vậy, nó không xuất hiện WinMerge hỗ trợ áp dụng các bản vá.


Không, không có gì giống như vậy ở đầu bản vá của tôi. Bạn đang nói rằng tên tệp và đường dẫn phải được bao gồm trong chính diff? Ai nghĩ rằng lên? Bạn phải làm gì nếu bạn muốn phân phối một diff cho ai đó có thể có những thứ được cài đặt trong các thư mục khác?!?
Mason Wheeler

Phần đầu của bản vá bắt đầu như thế này: --- / +++ / @@ -6,12 +6,12 @@ Không có tên tệp hoặc bất cứ thứ gì. Làm thế nào là một con đường tích hợp được cho là để làm việc? Điều gì sẽ xảy ra nếu tôi tạo bản vá trên XP và ai đó đang cố sử dụng nó trên Vista (hoặc ngược lại) và đường dẫn đến thư mục Tài liệu khác nhau?
Mason Wheeler

1
Tên tệp có liên quan đến thư mục gốc của kho lưu trữ, do đó, sự khác biệt về cấu trúc thư mục XP / Vista không thành vấn đề. Và lý do để có tên tệp trong bản vá là hầu hết các bản vá ảnh hưởng đến nhiều tệp.
David Z

Tôi hiểu rồi. OK, điều đó có ý nghĩa hơn. Cảm ơn vì đã làm sáng tỏ, David!
Mason Wheeler

1

Eclipse sẽ có thể làm điều đó, đi đến phối cảnh TeamSynyncize và sau đó vào Project-> Áp dụng bản vá


1

Đối với các dự án Java, tôi đã sử dụng NetBeans để áp dụng các tệp vá. Nếu mã Java bạn đang vá chưa phải là dự án NetBeans, hãy tạo dự án cho nó. Để tạo một dự án mới:

  • Chọn menu Tệp -> Dự án mới
  • Trong hộp thoại kết quả, làm cho nó trở thành một dự án Ứng dụng Java . Đặt tên cho nó trong hộp thoại và nhấp vào Finish.
  • Bấm chuột phải vào tên dự án của bạn và chọn Thuộc tính từ menu ngữ cảnh
  • Trong hộp thoại kết quả, chọn Nguồn và thêm Thư mục nguồn . Duyệt đến nguồn Java của bạn.

Bây giờ bạn có một dự án, áp dụng các bản vá:

  • Đánh dấu dự án của bạn để chọn nó
  • Từ menu chính, chọn menu Công cụ -> Áp dụng Diff Patch
  • Trong hộp thoại kết quả, duyệt đến tệp vá của bạn, chọn tệp đó và nhấn nút Patch.

Đó là nó. Bản vá của bạn nên được áp dụng và bạn sẽ thấy một cửa sổ khác hiển thị các thay đổi.


1

Tôi đã sử dụng BeyondCompare (thương mại) cho các khác biệt và hợp nhất, và công cụ này cũng có khả năng tạo, xem và áp dụng các bản vá.


1

Nếu bạn đang sử dụng Mercurial , điều này được thực hiện thông qua "nhập". Vì vậy, tại dòng hg importlệnh, lệnh hoặc (bạn có thể thấy --no-committùy chọn hữu ích) hoặc "Kho lưu trữ" => "Nhập ..." trong Hg Workbench.

Lưu ý rằng những điều này sẽ cam kết thay đổi theo mặc định; bạn có thể tránh hg import --no-committùy chọn này bằng cách sử dụng dòng lệnh hoặc nếu bạn đã sử dụng Hg Workbench, bạn có thể thấy nó hữu ích khi phát hành hg rollbacksau khi hợp nhất.


Chính xác những gì tôi đang tìm kiếm! Tôi đã tự hỏi làm thế nào để tránh các cam kết.
Keshav

0

Khi áp dụng các bản vá bằng TortoiseSVN, tôi thường lưu đường dẫn trong thư mục gốc của kho lưu trữ đã kiểm tra. Sau đó, bạn có thể nhấp chuột phải vào bản vá, chuyển đến trình đơn TortoiseSVN và nhấp vào ApplyPatch. ApplyPatch sẽ tự động tìm ra mức nào trong hệ thống phân cấp thư mục mà bản vá được tạo.

Tuy nhiên, tôi đã có vấn đề trong quá khứ với việc áp dụng các bản vá có chứa các tệp mới hoặc liên quan đến việc đổi tên thành các tệp. Bất cứ thuật toán nào Rùa sử dụng cho điều này dường như không xử lý tốt các tình huống đó. Unicode có thể cung cấp cho bạn các vấn đề tương tự.


0

Bạn có hai màn hình? Tôi đã gặp vấn đề tương tự với TortoiseMerge và tôi nhận ra rằng khi tôi vô hiệu hóa một trong những màn hình, cửa sổ nhỏ với danh sách tệp xuất hiện. Hy vọng điều này sẽ giúp bạn.


0

Nếu bạn nhận được thông báo lỗi "Không phải là bản sao làm việc" thì hãy thử chọn một thư mục từ hộp thoại TortoiseMerge là thư mục làm việc của SVN.


0

Một BusyBox cổng cho Windows có cả một diff và vá lệnh, nhưng họ chỉ hỗ trợ định dạng thống nhất.


0

Chỉ dùng:

patch -p0 < path-file.patch

nhớ chỉ thực hiện lệnh này từ vị trí thư mục nơi bạn đã tạo bản vá.

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.