Windows에서 diff 패치를 어떻게 적용합니까?


136

diff 패치를 만들 수있는 많은 프로그램이 있지만 패치를 적용하는 데 많은 시간을 할애하고 있습니다. 패치를 배포하려고하는데 사용자에게 패치를 적용하는 방법에 대한 질문이 있습니다. 그래서 나는 그것을 스스로 알아 내려고 노력했지만 단서가 없다는 것을 알았습니다. 내가 찾을 수있는 대부분의 도구는 명령 줄입니다. (명령 줄을 처리 할 수 ​​있지만, 친절하고 친근한 GUI가 없으면 많은 사람들이 길을 잃을 수 있습니다.

TortoiseSVN을 사용해 보았습니다. 적용 할 패치가 있습니다. 패치를 마우스 오른쪽 버튼으로 클릭하면 TortoiseSVN 하위 메뉴 아래에 "패치 적용"이라는 옵션이 있습니다. 빈 창을 위로 올리면됩니다.

그래서 나는 Open을 쳤다. 통합 diff를 병합하고 적용하는 두 가지 옵션이 있습니다. 패치는 운 좋게 통합 된 diff 형식입니다. 그러나 apply 옵션은 작동하지 않습니다. 패치와 폴더를 요청합니다. 어떻게 든 패치를 적용 할 파일 을 요청하는 것을 잊었습니다 ! 따라서 TortoiseSVN은 평범하지 않습니다. 패치와 파일을 가져 와서 올바르게 적용 할 수있는 Windows GUI 기반 유틸리티가 있습니까?

편집 : 지금까지 답글을 보면 Tortoise가 이미 버전이 지정된 파일 인 경우 Tortoise가 올바르게 수행하는 것 같습니다. 여기서는 그렇지 않습니다. SVN 저장소에서 나오지 않은 파일에 패치를 적용 할 수 있어야합니다. SVN이 diff를 사용하고 그것들을 만들고 적용하는 방법을 알아야한다는 것을 알기 때문에 Tortoise를 사용하려고했습니다.


WinMerge의 대답은 좋았지 만 패치를 적용하는 방법이 아니라 패치를 만드는 방법 만 설명합니다. TortoiseHG에는 패치를 적용하는 좋은 방법이 있지만 내가 아는 한 hg 저장소에있는 파일에만 적용 할 수 있습니다. 외부 SVN TortoiseDiff가 할 수 없다면 GUI 도구가 가능한지 궁금합니다.
워렌 P

3
와우, 당신은 옳습니다. 적어도 WinMerge에서는 짧은 대답은 아직 없습니다. WinMerge의 기능 요청은 여기 sourceforge.net/tracker/…
KCD

답변:


32

패치 적용

TortoiseMerge로 :

  1. 기존 SVN repo 디렉토리를 찾아서 엽니 다.
  2. "merges"라는 새 디렉토리를 작성하십시오 (없는 경우).
  3. .patch 파일을 적용 할 파일을 복사하십시오.
  4. 다음 단계를 계속하기 전에 svn 저장소에 ADD 및 COMMIT
  5. 병합을 마우스 오른쪽 버튼으로 클릭 하고 패치 적용 ...을 선택 하십시오.
  6. 목록에서 파일을 두 번 클릭하십시오.
  7. diff가있는 패치 된 파일이 오른쪽 창에 표시됩니다
  8. 해당 분할 창을 클릭 하고 파일-> 다른 이름으로 저장 ...으로 저장 또는 내보내기를 누르 십시오 .

TortoiseMerge에서 열면 대체 스크리닝. 아래 화면에서 directory는 위의 2 단계에서 언급 한 "merges"디렉토리를 나타냅니다. 선별

WinMerge GUI의 스크린 샷 : 선별


@WarrenP : 예 TortoiseMerge를 사용하여 패치를 적용하는 방법을 설명합니다
Walter Stabosz

4
내 의견은 편집 전에 의미가 있었고 편집 후에는 더 이상 의미가 없습니다. 아직 혼란 스럽습니까? OP가 2011 년 10 월 이후 다시 답변을 수정 했으므로 위의 수정 타임 스탬프 (3 월 24 일, '11)는 잘못된 것으로 보입니다. 내 의견의 타임 스탬프도 잘못되었다고 생각합니다.
Warren P

9
@SheriffMd "D : \ Folder is working copy"오류가 표시되지 않습니까?
onmyway133

1
@SheriffMd 또한 "폴더 ... 작업 복사본이 아닙니다"라는 메시지가 나타납니다. 따라서 거북이 병합을 사용하여 버전이없는 파일에 패치를 적용하는 방법은 무엇입니까?
피터 T.

1
@ onmyway133, 나는 단계를 다시 표현했습니다. 2 단계 및 4 단계를 참조하십시오. "작업 복사본이 아닙니다"오류 메시지가 나타나지 않습니다.
보안관 Md

21

나는 그것을 위해 순수한 파이썬 도구를 만들었습니다 . 교차 플랫폼 동작을 예측할 수 있습니다. 새 파일을 작성하지는 않지만 (작성시) GUI가 없지만 그래픽 도구를 작성하는 라이브러리로 사용할 수 있습니다.

업데이트 : Python이 설치되어 있으면 사용하는 것이 더 편리합니다.

pip install patch
python -m patch

1
나는 이것을 많이 사용합니다. 감사합니다 @techtonik. Python3으로 작동시키는 것에 대한 뉴스가 있습니까?
pelson

관리 권한으로 pip install 패치를 실행하여 작동하는지 확인하십시오.
Vertexwahn

@Vertexwahn은 Linux에 있습니까?
anatoly techtonik

파이썬은 어디에서나 실행됩니다. 저는 Windows 10으로 테스트했습니다
Vertexwahn

자식 패치가 작동하지 않을 때 Windows 10에서 작동했습니다. 감사합니다!
sqrl0

19

TortoiseMergeTortoiseSVN 과 함께 제공되는 별도의 유틸리티입니다.

TortoiseDiff.zip 아카이브 에서 별도로 다운로드 할 수도 있습니다 . 이렇게하면 버전이 지정되지 않은 파일에 통합 된 diff를 적용 할 수 있습니다.


21
AFAIK 버전이없는 파일에는 패치를 적용 할 수 없습니다.
pihentagy

버전이없는 파일에 적용하는 데 문제가 없었습니다.
Paul Shannon

다른 사람들은 : S.
UmNyobe

1
버전 1.8.7은 버전 화되지 않은 대상에 대한 오류를 제공합니다.
Nick Westgate

15

GUI를 선호한다고 말했지만 명령 줄 도구가 훌륭하게 작동합니다. Windows 로의 유닉스 도구 포트에 대해서는 GnuWin 을 참조하십시오 . 분명히 패치 명령이 필요합니다. ;-)

그래도 회선 종료에 문제가 생길 수 있습니다. GnuWin 포트는 패치 파일에 DOS 스타일 라인 종료 (CR / LF)가 있다고 가정합니다. 합리적으로 똑똑한 편집기에서 패치 파일을 열어보십시오.


잘 넣어 이 의견이 없으면 회선 종료 문제를 파악할 수 없었을 것입니다.
Bryan

줄 끝을 처리하는 또 다른 방법은 명령 줄에 "--binary"옵션을 추가하는 것입니다.
BeReal82

4
이것이 나를 올바른 길로 인도 한 것입니다. 그러나 Windows 7 이상을 실행하면 매번 UAC 팝업이 나타나지 않도록 patch.exe의 매니페스트를 업데이트해야합니다. 사용 방법은 다음 페이지를 참조하십시오. math.nist.gov/oommf/software-patchsets/patch_on_Windows7.html
Anttu

1
UAC 수정 프로그램을 사용하더라도 GnuWin 버전의 패치는 파일 보안 설정을 엉망으로 만듭니다. git과 함께 제공된 빌드에는 두 가지 문제가 없습니다.
Artfunkel

8

TortoiseSVN에서는 패치 적용이 작동합니다. 패치는에서 작성된 디렉토리와 동일한 디렉토리에 적용해야합니다 . 이것을 명심하는 것이 항상 중요합니다. TortoiseSVN에서 수행하는 방법은 다음과 같습니다.

패치를 적용 할 폴더를 마우스 오른쪽 버튼으로 클릭하십시오. 패치 파일의 위치를 ​​묻는 대화 상자가 나타납니다. 파일을 선택하면 변경된 파일이 나열된 작은 파일 목록 창이 열리고 각 항목을 클릭하면 해당 파일에 대한 패치 작업을 나타내는 diff 창이 열립니다.

행운을 빕니다.


8
도움이되지 않습니다. 대상 파일이 SVN 아카이브에서 나오지 않았습니다. (원래 게시물에 대한 편집을 참조하십시오.)
Mason Wheeler

8

Git 설치의 patch.exe 유틸리티는 Windows 10에서 작동합니다.

Windows 용 Git을 설치 한 다음 "C:\Program Files\Git\usr\bin\patch.exe"명령을 사용하여 패치를 적용하십시오.

Hunk #1 FAILED at 1 (different line endings).패치를 적용하는 동안 출력 과 같은 오류 메시지 가 출력 된 경우 명령 줄에 ( -l바로 가기 --ignore-whitespace) 또는 --binary스위치를 추가하십시오.


이 질문은 대부분 일반적인 명령 줄 도구에 익숙하지 않은 일반 사용자를위한 GUI 도구에 관한 것입니다. 최소한 예제로 전체 샘플 명령을 제공 한 경우 답변이 더 유용합니다.
Álvaro González

Windows 10에서 작곡가와 함께 작동합니다.
ecdani

7

패치 유틸리티 의이 Win32 기본 포트를 사용할 수 있습니다 .

그것은 다른 유틸리티의 더 큰 선택과 함께 제공되며 Cygwin과 유사하지만 DLL이나 유사한 것이 필요하지 않습니다. 원하는 작은 실행 파일을 골라 원하는 곳에 저장하십시오.

간단한 사용법 :

patch.exe -i <patchfile>

추가 도움을 받으십시오.

patch.exe --help

4
Windows 7에서 문제가 있습니다. 새 CMD 창을 열고 실행하려고 할 때 관리자 권한을 묻는 메시지가 표시됩니다 patch.exe.
Roy Tinker

3
패치 실행 파일은 Git for Windows 번들에서도 찾을 수 있습니다.
Snicksie

6
patch.exe 실행 문제가 발생하면 이름을 포함하지 않는 다른 이름으로 바꿀 수 있습니다 patch. Windows는 단어 patch가 포함 된 모든 exe를 의심스러운 것으로 간주합니다 .
wbond

2

편집 : 지금까지 답글을 보면 Tortoise가 이미 버전이 지정된 파일 인 경우 Tortoise가 올바르게 수행하는 것 같습니다. 여기서는 그렇지 않습니다. SVN 저장소에서 나오지 않은 파일에 패치를 적용 할 수 있어야합니다. SVN이 diff를 사용하고 그것들을 만들고 적용하는 방법을 알아야한다는 것을 알기 때문에 Tortoise를 사용하려고했습니다.

Cygwin 을 설치 한 다음 명령 행 패치 도구를 사용하여 패치 를 적용 할 수 있습니다. 패치에 적용되는 이 유닉스 매뉴얼 페이지 도 참조하십시오 .


4
그래, 할 수있어 실제로 Cygwin이 있습니다. 아마도 귀하의 솔루션을 작동시킬 수도 있습니다. 그래도 사용자를 통과 시키지는 않을 것입니다. 오늘날 몇 명의 Windows 사용자가 명령 줄이 무엇인지 모르는 지 알고 있습니까? : P
Mason Wheeler

2

TortoiseSVN (TortoiseMerge) 에는Index: foobar.py diff / patch 파일 의 행필요 합니다. TortoiseSVN을 마우스 오른쪽 버튼으로 클릭하여 TortoiseSVN이 아닌 패치 파일을 작동시키기 위해 필요한 작업입니다. 패치 적용 명령 .

전에:

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

후:

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

또는 기여자가 특정 개정판을 알고있는 경우 :

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

2

http://www.msys2.org/ 에서 MSYS2를 사용합니다 .

그것은 같은 많은 유틸리티 제공 patch, which, git, tree, 그리고 더 많은합니다.

MSYS2를 설치 한 후 패키지 관리자를 실행하여 patch다음 을 설치하십시오 .

pacman -S patch

이것은 명령 행 도구를 설치하는 복잡한 방법입니다. 나는 당신이 질문 제목을 읽고 질문 자체는 읽지 않는다고 생각합니다. :)
Álvaro González

1

패치는 적용 할 파일을 알려줍니다. 헤더는 다음과 같아야합니다 (메모장 또는 즐겨 찾는 텍스트 편집기에서 확인).

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

Subversion 패치의 경우 파일 이름이 동일하기 때문에 개정 번호도 있습니다.

GNU 패치 를 사용하면 그 이름 을 무시할 수 있지만 같은 GUI 도구를 모릅니다. 다양한 diff 프로그램을 확인했지만 WinMerge가 패치 적용을 지원하지 않는 것 같습니다.


아니요, 패치 상단에는 그런 것이 없습니다. 파일 이름과 경로가 diff 자체에 포함되어야한다고 말하고 있습니까? 누가 그렇게 생각해? 다른 폴더에 물건을 설치 한 사람에게 diff를 배포하려면 어떻게해야합니까?!
메이슨 휠러

패치의 상단은 다음과 같이 시작합니다 : --- / +++ / @@ -6,12 +6,12 @@ 파일 이름이나 아무것도 없습니다. 내장 경로는 어떻게 작동합니까? XP에서 패치를 만들고 누군가 Vista에서 패치를 사용하려고하거나 문서 폴더의 경로가 다른 경우 어떻게해야합니까?
메이슨 휠러

1
파일 이름은 리포지토리의 루트 디렉터리를 기준으로하므로 XP / Vista 폴더 구조 차이는 중요하지 않습니다. 패치에 파일 이름이있는 이유는 대부분의 패치가 여러 파일에 영향을 미치기 때문입니다.
David Z

내가 참조. 더 이해가 되네요. 정리 해줘서 고마워, 데이빗!
메이슨 휠러

1

Eclipse는 그것을 할 수 있어야합니다 .TeamSynchronize 퍼스펙티브로 이동 한 다음 Project-> Apply 패치로 이동하십시오.


1

Java 프로젝트의 경우 NetBeans 를 사용 하여 패치 파일을 적용했습니다. 패치중인 Java 코드가 아직 NetBeans 프로젝트가 아닌 경우 해당 프로젝트를 작성하십시오. 새 프로젝트를 만들려면

  • 메뉴 파일 -> 새 프로젝트를 선택하십시오.
  • 결과 대화 상자에서 Java 애플리케이션 프로젝트로 만드십시오 . 대화 상자에 이름을 지정하고을 클릭하십시오 Finish.
  • 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 상황에 맞는 메뉴에서 속성을 선택하십시오.
  • 결과 대화 상자에서 소스를 선택 하고 소스 폴더를 추가하십시오 . Java 소스를 찾아보십시오.

이제 프로젝트가 있으므로 패치를 적용하십시오.

  • 프로젝트를 강조 표시하여 선택하십시오
  • 기본 메뉴에서 메뉴 도구 -> 다른 패치 적용을 선택하십시오.
  • 결과 대화 상자에서 패치 파일을 찾아서 선택한 다음 패치 단추를 누르십시오.

그게 다야. 패치를 적용해야하며 변경 사항을 보여주는 diff 창이 나타납니다.


1

이미 diffs 및 merge에 BeyondCompare (상업용)를 사용하고 있으며이 도구 에는 패치를 만들고보고 적용 하는 기능 도 있습니다.


1

Mercurial 을 사용하는 경우 "가져 오기"를 통해 수행됩니다. 따라서 Hg Workbench 의 명령 행, hg import명령 또는 ( --no-commit옵션이 유용 할 수 있음 ) 또는 "Repository"=> "Import ..."에서.

이것들은 기본적으로 변경 사항을 커밋합니다. hg import --no-commit명령 행을 사용하거나 Hg Workbench를 사용한 경우이 옵션을 사용하여 피할 수 있습니다 hg rollback. 병합 후 발행하는 것이 유용 할 수 있습니다 .


정확히 내가 찾던 것! 커밋을 피하는 방법이 궁금합니다.
Keshav

0

TortoiseSVN을 사용하여 패치를 적용 할 때는 일반적으로 체크 아웃 된 저장소의 루트에 경로를 저장합니다. 그런 다음 패치를 마우스 오른쪽 버튼으로 클릭하고 TortoiseSVN 메뉴로 이동 한 다음 ApplyPatch를 클릭하십시오. ApplyPatch는 디렉토리 계층 구조에서 패치가 작성된 레벨을 자동으로 파악해야합니다.

그러나 과거에는 새 파일을 포함하거나 파일 이름을 바꾸는 패치를 적용하는 데 문제가있었습니다. Tortoise가 어떤 알고리즘을 사용하더라도 이러한 시나리오를 잘 처리하지 못하는 것 같습니다. 유니 코드는 비슷한 문제를 줄 수 있습니다.


0

두 대의 모니터가 있습니까? TortoiseMerge와 동일한 문제가 발생하여 모니터 중 하나를 비활성화하면 파일 목록이있는 작은 창이 나타납니다. 이것이 도움이되기를 바랍니다.


0

"작업 복사본이 아님"오류 메시지가 표시되면 SVN의 작업 디렉토리 인 TortoiseMerge 대화 상자에서 디렉토리를 선택하십시오.


0

비지 박스의 Windows 용 포트는 모두 DIFF 및 패치 명령을 가지고 있지만, 그들은 단지 통합 형식을 지원합니다.


0

그냥 사용하십시오 :

patch -p0 < path-file.patch

패치를 작성한 폴더 위치에서만이 명령을 실행하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.