SHA-1 커밋 번호 목록에 대한 패치를 생성하는 스크립트를 작성해야 합니다.
git format-patch <the SHA1>
사용해 보았지만 SHA-1 값 이후 각 커밋에 대한 패치가 생성되었습니다. 수백 개의 패치가 생성된 후 프로세스를 종료해야 했습니다.
특정 SHA-1 값에 대해서만 패치를 생성하는 방법이 있습니까?
질문자 :elle
SHA-1 커밋 번호 목록에 대한 패치를 생성하는 스크립트를 작성해야 합니다.
git format-patch <the SHA1>
사용해 보았지만 SHA-1 값 이후 각 커밋에 대한 패치가 생성되었습니다. 수백 개의 패치가 생성된 후 프로세스를 종료해야 했습니다.
특정 SHA-1 값에 대해서만 패치를 생성하는 방법이 있습니까?
노력하다:
git format-patch -1 <sha>
또는
git format-patch -1 HEAD
위의 문서 링크에 따르면 -1
플래그는 Git에게 패치에 포함되어야 하는 커밋 수를 알려줍니다.
-<n>
최상위 커밋에서 패치를 준비합니다.
다음 명령을 사용하여 패치를 적용합니다.
git am < file.patch
특정 SHA-1 해시에서 최상위 <n> 커밋에서 패치를 생성하는 경우:
git format-patch -<n> <SHA-1>
단일 패치 파일에 있는 헤드의 마지막 10개 패치:
git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
커밋 1 후에 커밋 ID 2가 있다고 가정하면 다음을 실행할 수 있습니다.
git diff 2 1 > mypatch.diff
여기서 2와 1은 SHA-1 해시입니다.
이 명령은 ( @ Naftuli Tzvi Kay 가 이미 제안한 대로),
git format-patch -1 HEAD
HEAD
를 특정 해시 또는 범위로 바꿉니다.
Unix 메일박스 형식과 유사한 형식의 최신 커밋에 대한 패치 파일을 생성합니다.
-<n>
- 최상위 <n> 커밋에서 패치를 준비합니다.
그런 다음 다음을 통해 패치 파일을 사서함 형식으로 다시 적용할 수 있습니다.
git am -3k 001*.patch
참조: man git-format-patch
.
git format-patch commit_Id~1..commit_Id git apply patch-file-name
빠르고 간단한 솔루션.
(단일 커밋) 패치가 특정 커밋 위에 적용되도록 하려면 새로운 git 2.9(2016년 6월) 옵션 git format-patch --base
git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE # or git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE # or git config format.useAutoBase true git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE
커밋 bb52995 , 커밋 3de6651 , 커밋 fa2ab86 , 커밋 ded2c09 (2016년 4월 26일) by Xiaolong Ye(``) 를 참조 하세요.
(2016년 5월 23일 72ce3ff 커밋 에서 Junio C gitster
-- gitster -- 병합)
format-patch
: 기본 트리 정보를 기록하는--base
유지 관리자 또는 타사 테스터는 패치 시리즈가 적용되는 정확한 기본 트리를 알고 싶어할 수 있습니다. git format-patch에 기본 트리 정보를 기록하고 첫 번째 메시지(커버 레터 또는 시리즈의 첫 번째 패치) 끝에 추가
--base
기본 트리 정보는 "기본 커밋"으로 구성되며, 이는 다른 모든 사람이 작업하는 프로젝트 기록의 안정적인 부분의 일부인 잘 알려진 커밋과 잘 알려진 0개 이상의 "필수 패치"로 구성됩니다. 패치를 적용하기 전에 토폴로지 순서로 "기본 커밋" 위에 적용해야 하는 "기본 커밋"의 일부가 아닌 실행 중인 패치입니다.
"기본 커밋"은 "
base-commit:
" 다음에 커밋 개체 이름의 40진수가 옵니다.
"prerequisite patch"는 "prerequisite-patch-id:
" 다음에 40-hex "patch id"가 오는 것으로 표시되며, 이는 "git patch-id --stable
" 명령을 통해 패치를 전달하여 얻을 수 있습니다.
Git 2.23(Q3 2019)에서는 " format-patch
" --base
" 옵션이 다음과 호환되는 방식으로 계산하도록 업데이트된 불안정한 방식으로 필수 패치에 대한 패치 patch-ids
" git patch-id --stable
".
Stephen Boyd( akshayka
)의 commit a8f6855 , commit 6f93d26 (2019년 4월 26일)을 참조하십시오.
(2019년 6월 13일 커밋 8202d12 에서 Junio C gitster
-- gitster -- 병합)
format-patch
--base patch-id
출력을 안정적으로 만듭니다.
diff.c
patch-id
생성 코드에서 큰 덩어리를 처리할 때마다 컨텍스트를 플러시하지patch-id
' 도구를 사용하여 "안정된" 패치 ID를 생성할 때 그렇게 했습니다.유사한 논리를
patch-id.c
에서 diff.c로diff.c
format-patch --base=
' 유형의 명령 호출에 대한 패치 ID를 생성할 때 동일한 해시를 얻을 수 있도록 합시다.
힘내 2.24 (Q4 2019), 전에 " git format-patch -o <outdir>
"의 상당했다 " mkdir <outdir>
"없음 " mkdir -p <outdir>
"수정되고있다.
Bert Wesarg( bertwesarg
)의 commit edefc31 (2019년 10월 11일)을 참조하십시오.
(2019년 10월 18일 f1afbb0 커밋 에서 Junio C gitster
-- gitster -- 병합)
format-patch
: 출력 디렉토리의 주요 구성 요소 생성사인오프: Bert Wesarg
"자식 포맷 패치는 -o '의 등가 않았다'
mkdir <outdir>
'하지'mkdir -p <outdir>
'이 보정되고있다.
보안에 영향을 미칠 수 있는 선행 디렉토리에서
adjust_shared_perm
'을 사용하지 마십시오.git init
'와 같이 'config.sharedRepository
'를 일시적으로 비활성화하면 달성됩니다.
Git 2.25(2020년 1분기)에서는 format.useAutoBase
구성 변수가 설정되어 git rebase
"가 제대로 작동하지 않아 수정되었습니다.
커밋 cae0bc0 , 커밋 945dc55 , 커밋 700e006 , 커밋 a749d01 , 커밋 0c47e06 (2019년 12월 4일) Denton Liu ( Denton-L
) .
(2019년 12월 16일 커밋 71a7de7 에서 Junio C gitster
-- gitster -- 병합)
rebase
:format.useAutoBase
파손 수정보고자: Christian Biesinger
사인오프: Denton Liu
format.useAutoBase = true
로 rebase를 실행하면 오류가 발생했습니다.fatal: failed to get upstream, if you want to record base commit automatically, please use git branch --set-upstream-to to track a remote branch. Or you could specify base commit by --base=<base-commit-id> manually error: git encountered an error while preparing the patches to replay these revisions: ede2467cdedc63784887b587a61c36b7850ebfac..d8f581194799ae29bf5fa72a98cbae98a1198b12 As a result, git cannot rebase them.
format.useAutoBase
의 효과가 무효화--no-base
를 rebase에서 format-patch로 전달하여 이 문제를 수정합니다.
Git 2.29(2020년 4분기)에서 " git format-patch
" ( man ) 는 자동으로 계산된 기반이 의미가 없을 때 no-op이 되도록 format.useAutoBase
구성 변수에 대한 가능한 값으로 whenAble
"을 취하는 방법을 배웁니다.
Jacob Keller( jacob-keller
)의 commit 7efba5f (2020년 10월 1일)를 참조하십시오.
(2020년 10월 5일 커밋 5f8c70a 에서 Junio C gitster
-- gitster -- 병합)
format-patch
format.useAutoBase
"whenAble
" 옵션을 가르칩니다.서명자: Jacob Keller
format.useAutoBase
구성 옵션은 사용자가 기본적으로 format-patch에 대해--base=auto
'를 활성화할 수 있도록 합니다.이것은 고대 패치를 포맷하려고 할 때 예기치 않은 실패로 인해 때때로 불량한 워크플로로 이어질 수 있습니다.
$ git format-patch -1 <an old commit> fatal: base commit shouldn't be in revision list
--base
요청했다는 것이 반드시 즉각적으로 명백하지 않기 때문에 매우 혼란스러울 수 있습니다(명령행이 아니라 구성에 있었기 때문에).
--base=auto
가 실패하기를 원합니다. 형식화된 패치가 요청될 때 기본 정보를 포함하지 않은 경우에도 마찬가지로 혼란스러울 것이기 때문입니다.
format.useAutoBase
에 새 모드인 "whenAble
"을 가르칩니다.이 모드는 format-patch가 가능한 경우 기본 커밋을 포함하도록 시도합니다. 그러나 유효한 기본 커밋을 찾을 수 없으면 format-patch는 기본 커밋 없이 패치를 계속 포맷합니다.
--base
와 함께 또 다른 브랜치 이름을 사용할 수 없도록 하려면--base=whenAble
또는--base=whenable
.대신 콜백을 사용
base_commit
옵션을 리팩터링하고auto_base
에 의존합니다.이것은 사용자가 명령줄에서 이 선택적 기본 커밋 생성을 요청할 수 없음을 의미합니다. 그러나 이것은 그다지 가치가 없습니다. 사용자가 기본 정보를 수동으로 요청하면 적절한 기본 커밋을 얻지 못했다는 사실을 즉시 알립니다. 이를 통해 사용자는 형식을 계속할지 여부에 대해 정보에 입각한 선택을 할 수 있습니다.
--base
대한 새로운 작동 모드를 다루는 테스트를 추가하십시오.
git config
이제 man 페이지에 다음을 포함합니다.
기본적
format-patch
--base=auto
활성화할 수 있도록whenAble
"로 설정할 수도 있지만 그렇지 않으면 형식이 죽지 않고 기본 정보 추가를 건너뛸 수 있습니다.
Git 2.30(2021년 1분기)에서는 " git format-patch --output=there
" ( man ) 가 예상대로 작동하지 않고 대신 충돌했습니다.
이제 옵션이 지원됩니다.
commit dc1672d , commit 1e1693b , commit 4c6f781 (2020년 11월 4일) Jeff King( peff
) 을 참조하십시오 .
(2020년 11월 18일 5edc8bd 커밋 에서 Junio C gitster
-- gitster -- 병합)
format-patch
: 지원 --출력 옵션보고자: Johannes Postler
서명자: Jeff King
우리는 format-patch에서
--output
옵션을 지원하려고 한 적이 없습니다. 그리고 baa4adc66a (parse-options: disable option abbreviation withPARSE_OPT_KEEP_UNKNOWN,
2019-01-27, Git v2.22.0-rc0)까지는 트리거가 불가능했습니다.setup_revisions()
에 넘기기 전에 먼저 format-patch 옵션을 구문 분석합니다.
커밋하기 전에 "--output-directory=foo"의 약어로--output=foo
그러나 이후에는 약어를 확인하지 않고 --output이 diff 코드로 전달됩니다.그 결과 넌센스 동작과 버그가 발생합니다. diff 코드는 rev.diffopt.file에서 파일 핸들을 열었지만 각 개별 패치 파일에 대해 여는 자체 핸들로 덮어씁니다. 따라서 --output 파일은 항상 비어 있습니다. 그러나 더 나쁜 것은 diff 코드가 rev.diffopt.close_file도 설정하므로
log_tree_commit()
이 파일 핸들 자체를 닫는다는 것입니다.cmd_format_patch()
의 메인 루프가 다시 닫으려고 시도하여 이중 자유가 발생합니다.가장 간단한 해결책은 아무도 의도하지 않았기 때문에 format-patch로 --output을 허용하지 않는 것입니다. 그러나 실수로 문서화했습니다(format-patch에 diff-options가 포함되어 있기 때문에). 그리고 지정된 파일에 전체 출력을 기록하는
git log
" ( man ) 와 함께 작동합니다. format-patch에서도 작동하도록 만드는 것은 쉽습니다. 실제로 --stdout과 동일하지만 특정 파일을 가리킵니다.
"close_file"
플래그에 의해 --output 옵션의 사용을 감지할 수 있습니다. 따라서 해당 플래그를 설정 해제하기만 하면 되지만 다른 작업은 수행할 필요가 없습니다. 그렇지 않으면 우리의 상황은 --stdout과 똑같습니다(파일을 fclose()하지 않지만 stdout의 경우도 마찬가지입니다. 프로그램을 종료하면 알아서 처리됩니다).
특정 커밋(마지막 커밋 아님)에서 패치를 생성하려면:
git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE
지정된 파일을 diff하려는 경우 다음을 사용할 수 있습니다.
git diff 마스터 766eceb -- 연결/ > 000-mysql-connector.patch
내 Mercurial 배경으로 다음을 사용하려고했습니다.
git log --patch -1 $ID > $file
git format-patch -1 $ID
사용을 고려하고 있습니다.
특정 SHA-1 값에 대해서만 패치를 생성하는 방법은 무엇입니까?
아주 간단합니다.
옵션 1. git show commitID > myFile.patch
옵션 2. git commitID~1..commitID > myFile.patch
참고: commitID
를 실제 커밋 ID(SHA-1 커밋 코드)로 바꿉니다.
출처 : http:www.stackoverflow.com/questions/6658313/how-can-i-generate-a-git-patch-for-a-specific-commit
MySQL에서 명령줄을 사용하여 사용자 계정 목록을 얻으려면 어떻게 해야 합니까? (0) | 2022.07.06 |
---|---|
UnicodeEncodeError: 'ascii' 코덱은 위치 20의 u'\xa0' 문자를 인코딩할 수 없습니다: 서수가 범위(128)에 없음 (0) | 2022.07.06 |
객체에 대한 map 함수(배열 대신) (0) | 2022.07.06 |
문자열 형식: % 대 .format 대 f-문자열 리터럴 (0) | 2022.03.22 |
int32의 최대값은 얼마입니까? (0) | 2022.03.22 |