♾️Language & Framework/🐿️Golang

[Trouble Shooting] - DCO 오류 해결 (with. git rebase)

KangManJoo 2024. 9. 27. 01:55

Argo CD에 기여를 할 때 PR을 작성하고 나면, 테스트에서 다음과 같이 DCO라는 녀석이 실패하는 경우가 있습니다.

DCO란?

Developer Certificate of Origin의 줄임말로, 자신의 코드에 대해 인증하는 방법들을 의미합니다.
signed-off commit은 DCO의 일종으로 sign off로 자신의 코드에 이름과 이메일을 남겨 서명하는 것입니다.

서명하는 방법은 간단합니다. 커밋 메세지를 쓸 때 다음과 같이 -s 옵션을 주면 됩니다.

git commit -s -m "my message"

그러나 개인 레포에서 개발하다가 오픈 소스를 개발할 때, 별 생각 없이 intellj 혹은 Goland 같은 IDE를 이용해 커밋을 하게 된다면 -s 옵션이 생략되어 DCO 인증에서 막히게 됩니다.

하지만 좌절할 필요는 없습니다. 만약 DCO에서 테스트가 실패해도 옆에 디테일을 눌러 자세한 해결법을 확인할 수 있습니다.

그러나 리베이스 단계에서 커밋을 잘못하게 된다면.. 다음과 같은 사태를 초래할 수 있습니다.
저같은 경우는 원격 레포에서 포크해온 레포에서 협업을 한 뒤, merge 커밋이 생겼고 (로컬 보다 커밋이 한 개 더 많은 상태) 그 상태에서 위 메세지를 그대로 로컬에서 적용해 더 많은 커밋이 리베이스 되었습니다.
즉, 제가 만든 커밋 이전 커밋들에도 제 sign이 들어간 것입니다.

원격 레포에 이미 푸시까지 해버린 상황이라, 이도저도 할 수 없었습니다. 이미 원격 브랜치와 로컬 브랜치가 모두 오염되었고, PR까지 날려버린 상황..

혼자 작업했더라면 커밋 로그가 날아가더라도 다시 작업하고 푸시하면 되지만, 협업이기 때문에 그러한 작업도 곤란한 상황이었습니다.

따라서 저 상황에서는 다른 커밋들에 제가 sign한 내용만 지워주어야 했습니다.

해결

먼저 다음과 같이 문제가 발생한 커밋까지 리베이스를 해줍니다.

 git rebase -i HEAD~8

그럼 이런식으로 커밋 메세지들이 보이게 됩니다.
이제 수정하고 싶은 메세지를 선택해줍니다.

이렇게 수정하고 싶은 메세지를 edit으로 바꿔줍니다.

그리고 :wq로 변경내역을 저장하고 나오면, 리베이스가 진행되다가 edit을 작성한 커밋에서 멈추게 됩니다.
이때 다음 명령어로 커밋을 수정해줍니다.

git commit --amend

수정 페이지에서는 다음과 같이 커밋 내역들을 수정할 수 있습니다.
여기서 저의 사인오프 내역을 지워줍니다.

계속 git rebase --continue 로 넘어가며 오류들을 고쳐준 뒤, 다음과 같이 포크한 원격 레포를 바뀐 커밋 내역으로 덮어써줍니다.

git push --force-with-lease origin issue-19269:issue-19269

다시 커밋 내역을 확인해보면 정상적으로 변경된 것을 확인할 수 있습니다!

개인적으로 rebase가 잘만 쓰면 이렇게 커밋 내역을 고칠 때나, push 이후 최신 내역을 업데이트하거나 할 때 정말 유용한 것 같습니다.
오픈 소스를 사용하다보면 git에 대해 더 심도있게 공부하게 되고, 배우는 것도 많은 듯 합니다. ☺️