2017-11-03 12 views
1

this repository, git subtree merge --squash --prefix=resources/webidl2 8a7ff70664으로 커밋이있는 곳은 this repository이며 병합 충돌이 발생합니다. 디버그 출력을 사용하려면 -d 추가git-subtree가 최신 스쿼시를 찾지 못함

, 우리는 발견 :

Squash found: 5353ef707674e9d894f207581d7dffab2609b832 bd216bcd5596d60734450adc938155deab1e1a80 

그러나,이 최신 스쿼시하지 않고, 수동으로 log call을 실행하고 --grep 옵션을 변경하면이 --grep="^git-subtree-dir: resources/webidl2/*\$"가 일치하지 않는 것을 명백하게된다 960a3d21bab0293630da8919847f87f4af3a3198은 명백한 이유가 없습니다 (정확히 일치하지는 않지만 --grep="^git-subtree-dir: resources/webidl2/*"과 일치 함). 일치하는 두 커밋에 모두 git-subtree-dir이 포함 된 줄은 동일한 바이트 단위이므로 일치하지 않는 이유는 이전 --grep 옵션과 일치하지만 다른 하나는 일치하지 않는 이유입니다).

git-subtree이 이전의 스쿼시를 찾지 못했다면 어떻게하면 로컬 스킬이다고 충돌을 일으키지 않고 새로운 스쿼시를 할 수 있을까요?

답변

1

커밋이 발견되지 않는의 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가 만드는 스쿼시 커밋을 수정하지 않는 것이 중요합니다.