이것이 패치를 만드는 좋은 방법입니까?


15

특정 gcc지점에서 공식 릴리스와 비교 하여 패치를 만들고 싶습니다 . 따라서 안정 릴리스에서 tarball의 압축을 풀면 패치를 적용하고 해당 특정 분기에 있던 것과 동일한 것을 얻을 수 있습니다.

패치를 만들어야하는 것은 처음이므로이 작업을 수행하는 것은 처음이며, 가장 중요한 문제는 매우 중요한 소프트웨어에 대해 이야기하고 있으므로 옵션과 구문 분석을 얻는 것입니다.

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

이것으로 충분하고 최선의 방법입니까?


여기에서 일반적인 모범 사례는 버전 관리 또는 일부 변형과 관련이 있습니다. 여기에는 수은, 자식 및 관련 패치 대기열 확장이 포함됩니다. 이불을 고려할 수도 있습니다. 아마도 당신이하려는 일에 대해 더 자세히 알 수 있습니까?
Faheem Mitha

@FaheemMitha "자세한 내용"은 무엇을 의미합니까? 나는 버전이 gcc공식 안정에서 tar.bz2와에서 그것의 또 다른 불안정 버전 git저장소를, 나는 물론 난 그냥 비교할 싶습니다의 패치를 생성하고자하는 master지점이 아닌 전체 저장소.
user2485710

자, diff만큼 간단한 것을 사용할 수 있는지 확인하십시오. 그러나 버전 관리를 사용하는 것이 일반적으로 바람직합니다. 우선, 그것은 당신이하고있는 일을 잃는 것을 훨씬 어렵게 만듭니다.
Faheem Mitha

@FaheemMitha 나는 당신이 제안하는 것을 이해하지 못합니다. 저는 tar.bz2분명히 git저장소 가 아닙니다. 어떻게 진행해야한다고 생각합니까?
user2485710

1
"버전 제어를 사용하여 패치 작성"을 검색하십시오. 내가 작성한 두 가지 이전 답변은 unix.stackexchange.com/a/127810unix.stackexchange.com/a/139817
Faheem Mitha

답변:


20

예, 이것은 패치를 만드는 좋은 방법입니다.

한마디로 :

  1. 단일 파일에 대한 패치를 작성하려면 명령이 다음과 같이 보일 수 있습니다

    diff -Naru file_original file_updated > file.patch

    어디

    • -N: 결석 파일을 비워 둡니다
    • -a: 모든 파일을 텍스트로 취급
    • -r: 발견 된 하위 디렉토리를 재귀 적으로 비교
    • -u: 통합 컨텍스트의 출력 NUM (기본값 3) 행
  2. 전체 디렉토리에 대한 패치를 작성하려면 다음을 수행하십시오.

    diff -crB dir_original dir_updated > dfile.patch

    어디

    • -c: 복사 된 컨텍스트의 출력 NUM (기본값 3) 행
    • -r: 하위 디렉토리를 재귀 적으로 비교
    • -B: 행이 모두 비어있는 변경 사항 무시

결국이 패치를 적용하려면 하나를 실행할 수 있습니다

patch -p1 --dry-run < dfile.patch

여기서 switch p는 patch가 경로 접두사를 제거하여 파일이 올바르게 식별되도록 지시합니다. 대부분의 경우이어야합니다 1.

--dry-run화면에 인쇄 된 결과가 마음에 들면 제거하십시오 .


질문 : 디렉토리 나 파일이 기존 디렉토리 dir_updated와 비교하여 삭제되면 어떻게 dir_original됩니까? 는 diff그것도을 담당되거나 생략됩니다?
user2485710

@ user2485710 diff는 어떤 파일이 삭제되었는지 확인합니다. file.patch그냥 텍스트 파일로, 그래서 당신은 어떤 편집기에서나 그것을 열 수 있습니다 cat그리고 당신은 같은 줄을 볼 것입니다only in dir_original: missingfile.txt
jimmij

좋아,하지만 그 또는 다른 patch것을 삭제 missingfile.txt합니까?
user2485710

때에 따라 다르지. 그것들을 제거하려면 diff -N ...첫 번째 예제와 같이 사용하십시오 . 일반적으로 patch빈 파일은 기본적으로 제거됩니다. 원하지 않으면 diff -crB질문과 같이 사용 하십시오. 또한 패치 매뉴얼 이후에 빈 파일을 제거하려면 명령의 -E옵션 patch이 필요합니다.if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
jimmij

내가 실행 한 diff -Naru dir/file dir/file.new > diff.patch얻기 can't find file to patch at input line 3patch -p0 --dry-run < diff.patch패치의 첫 줄 읽고 --- dir/file두 번째 +++ dir/file.new타임 스탬프와 함께,은 diff는 대한 정확한 파일 이름 명령 모습을보고 어떻게 어떤 옵션이, 바로 것 같다?
ptica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.