Git signed-off commit

DongGeon Lee
4 min readJan 23, 2021

--

certifies that committer has the rights to submit this work under the same license and agrees to a Developer Certificate of Origin.(source: git)

최근 Podman 사용법을 익히기 위해 Docker 문서를(?) 읽다가 문서에서 작은 오류를 발견하게 되어 문제의 부분을 수정하고 pull request를 보내는 과정에서 새로이 알게 된 내용에 대해 쓰고자 한다.

오픈 소스 프로젝트에 commit을 하고 pull request를 통해 기여를 하다 보면 가끔 Docker 혹은 Github-hosted repository같은 대형(?)프로젝트들은 sign-off commit을 요구하기도 한다.

Docker의 경우 CONTRIBUTING.md를 통해 PR될 commit은 sign될 것을 요구하고 있으며 sign이 되지 않은 변경 내역을 PR할 경우 DCO check를 통과하지 못하며 오류가 발생한다. 따라서 이번 글에서는 signed-off commit에 대해 알게 된 내용들을 적을 것이다.

What is a signed-off commit?

signed-off commit이란 말 그대로 sign-off된 commit을 의미한다. 그렇다면 sign이란 무엇이고 왜 필요한 것일까? 이는 바로 git 공식 문서를 참조하면 알아볼 수 있는데, 문서에 따르면

sign-off는 committer가 동일한 라이센스 아래에서 이 작업에 대해 제출할 권리를 가지며 Developer Certificate of Origin에 동의함을 증명하기 위해 사용된다. (source: git)

하지만 보통은 프로젝트마다 sign-off의 의미를 다르게 둔다고 하니 프로젝트 내의 가이드 혹은 contributing.md를 참고해야 한다고 한다.

How to sign-off commit?

git 명령어를 통하면 쉽게 가능하다.
-s옵션을 사용하면 commit message 마지막에 Signed-off-by: LeeDongGeon <secmatth1996@gmail.com> 이 추가되며 signed-off commit이 된다. (당연히 user.nameuser.email 이 git configs에 설정 되어있어야 한다.)

git commit -s -m "feat: add new feature"

만약 signed-off commit이 요구되는 repository에 sign없이 PR을 한다면 어떡해야 할까?

What if commit needs to be signed-off but PR was already sent?

이런 경우 DCO check가 설정되어 있다면 check 실패가 뜨면서 오류가 난다. PR을 하지 않았다면 git commit — amend — no-edit — signoff 명령어를 통해 commit을 수정하면 되지만, 이 경우는 몇 가지의 과정이 조금 더 필요하다.

먼저 PR된 변경이력(commit)을 내가 작업할 수 있는 공간으로 가져와야 한다. 다행히 이 과정은 Github문서에 자세히 나와 있다. Checking out pull requests locally를 참고하면 local repository에서 아래의 명령어로 PR된 branch로 checkout가능하다. (gh는 Github-CLI다.)

gh pr checkout 2944

이후 과정은 간단하다. 아래의 명령어로 commit을 수정하고 강제로 덮어 씌우면 된다.

git commit --amend --no-edit --signoff
git push --force-with-lease origin {branch-name}

이렇게 강제로 push를 하게 되면 PR은 다시 check를 수행하게 되고 DCO체크를 통과 할 수 있다.

Conclusion

Thanks for reading… :-)

ref:

  1. https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--s
  2. https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/checking-out-pull-requests-locally
  3. https://probot.github.io/apps/dco/

--

--

DongGeon Lee
DongGeon Lee

No responses yet