커밋이 발견되지 않는의 object에서 상대 : 여기
$ git cat-file -p 960a3d21bab0293630da8919847f87f4af3a3198 | hexdump -C
[…]
00000cc0 6c 6c 6f 77 20 60 2d 60 0d 0a 0d 0a 67 69 74 2d |llow `-`....git-|
00000cd0 73 75 62 74 72 65 65 2d 64 69 72 3a 20 72 65 73 |subtree-dir: res|
00000ce0 6f 75 72 63 65 73 2f 77 65 62 69 64 6c 32 0d 0a |ources/webidl2..|
00000cf0 67 69 74 2d 73 75 62 74 72 65 65 2d 73 70 6c 69 |git-subtree-spli|
00000d00 74 3a 20 38 38 63 35 63 35 62 36 62 62 36 37 35 |t: 88c5c5b6bb675|
00000d10 64 30 64 39 35 61 65 33 65 63 34 64 62 33 32 35 |d0d95ae3ec4db325|
00000d20 38 37 36 38 64 30 63 38 66 63 30 |8768d0c8fc0|
00000d2b
중요한 점은 git-subtree-dir
라인 0d 0a
(CR LF)로 끝나는 것입니다. git log --grep
의 $
작업이 라인 끝 부분과 일치합니다. Windows가 아닌 시스템에서 예상되는 것처럼 LF이므로 ^git-subtree-dir: resources/webidl2/*\$
은 일치하지 않습니다. 줄 끝 부분 앞에 CR이 있기 때문입니다.
커밋은 a GitHub PR에서 나타나고 GitHub를 통해 편집 된 커밋 메시지와 함께 "스쿼시 및 병합"을 통해 병합되었습니다. 위탁 메시지를 original commit과 비교했을 때 git-subtree
에서 원래 커밋 은에 해당 줄에 CR 바이트가 포함되어 있지 않음을 알 수 있습니다. (나중에 다른 문제를 야기 했으므로 나중에 스쿼시와 병합되었습니다.)
해결 방법을 살펴보면 가장 좋은 방법은 복사본을 다운로드하는 것입니다 git-subtree.sh
을 입력 한 다음 find_latest_squash
함수를 편집하여 예상 된 커밋 참조를 에코합니다. 이 커밋을 생성합니다 git-subtree
를 실행, 수행이와
echo "960a3d21bab0293630da8919847f87f4af3a3198" "88c5c5b6bb675d0d95ae3ec4db3258768d0c8fc0"
: 즉,과 기능을 대체 webidl2.js의 복사본을 업데이트 한,하지만 인해 이전 스쿼시이 뜻에 (부모 커밋을 960a3d21bab입니다) 실제로 모든 것을 삭제하는 커밋을 생성하고 webidl2.js의 새로운 사본을 추가합니다 (git-subtree는 문자 그대로 단지 서브 트리 인 커밋의 그래프를 루트에두고, 때로는 스쿼시 된 새로운 커밋으로 때때로 "스쿼시와 merge "는 접두어가 붙은 경로에 하위 트리가있는 커밋에 저장소 전체가 나타나게 한 다음 저장소의 하위 트리 복사본을 업데이트하는 병합 커밋을 나타냅니다.
git-subtree가 변경 내용에 매우 민감하기 때문에 git-subtree가 만드는 스쿼시 커밋을 수정하지 않는 것이 중요합니다.