etc

[git] git 커밋 컨벤션 (AngularJS Git Commit Message Conventions)

prefer2 2021. 11. 29. 21:00
공부를 목적으로 AngularJS Git Commit Message Conventions을 번역한 문서입니다.
많은 오역과 어색한 표현들이 포함되어 있을 수 있습니다.

 

목표


  • CHANGELOG.md를 스크립트로 작성할 수 있다
  • bisect을 사용하여 커밋을 무시할 수 있다 (formatting과 같은 중요하지 않은 커밋들)
  • 커밋 히스토리를 브라우징 할 때 더 좋은 정보를 제공한다

 

CHANGELOG.md 생성하기


변경 내역에는 new features, bug fixes, breaking changes 총 3개의 섹션을 사용한다. 이 리스트는 관련 커밋 링크와 함께 배포 시 생성될 수 있다. 물론 이 log을 실제 배포 이전에 수정할 수 있지만, it could generate the skeleton(아마도 흔적을 남길 수 있다는 뜻인듯하다...) 

마지막 배포 후부터의 commit message의 목록을 출력

git log <last tag> HEAD --pretty=format:%s

이번 배포에서 새로운 features

git log <last release> HEAD --grep feature

 

중요하지 않은 commit들 식별

formatting 변화 (공백이나 빈칸 삭제 혹은 추가, 들여쓰기 등), 세미콜론 누락, 주석 등은 중요하지 않은 변화들이다. 따라서 변경 내역을 조회할 때 이와 같은 커밋들은 무시해도 된다.

bisecting할때 다음과 같이 중요하지 않은 커밋들을 무시할 수 있다.

git bisect skip $(git rev-list --grep irrelevant <good place> HEAD)

 

히스토리 조회 시 더 많은 정보를 제공

일종의 '문맥(context)' 정보를 추가. 다음은 최신 angular commit 중 일부이다

  • Fix small typo in docs widget (tutorial instructions)
  • Fix test for scenario.Application - should remove old iframe
  • docs - various doc fixes
  • docs - stripping extra new lines
  • Replaced double line break with single when text is fetched from Google
  • Added support for properties in documentation

이 모든 메시지들은 어디가 변했는지를 알려주려 하지만 컨벤션이 없다.

  • fix comment stripping
  • fixing broken links
  • Bit of refactoring
  • Check whether links do exist and throw exception
  • Fix sitemap include (to work on case sensitive linux)

위 메시지들만 보고서는 어디가 변했는지 알기 어렵다. docs, docs-parser, compiler, senario-runner와 같이 어디가 변경되었는지 알려주는 것이 좋다. 

물론 모든 파일을 확인하면 정보를 알 수 있다. 하지만 너무 느리다. git history들을 보면 어디가 변했는지 명시하려고 하는 것은 보이지만, 컨벤션이 없다.

 

commit 메시지 포멧


<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

커밋 메시지의 각 줄은 100글자를 넘겨서는 안된다! 그래야 메시지가 읽기 쉽다.

 

👉 Subject line

제목줄은 변화에 대한 간결한 설명을 포함한다.

Allowed <type>

  • feat (feature): 새로운 기능 추가
  • fix (bug fix): 버그 수정
  • docs (documentation): 문서
  • style (formatting, missing semi colons, …)
  • refactor: 코드 리팩토링
  • test (when adding missing tests): 테스트 관련
  • chore (maintain): 기타 수정

Allowed <scope>

커밋 변화가 일어난 곳을 특정한다. $$location, $browser, $compile, $rootScope, ngHref, ngClick, ngView, 등이 들어갈 수 있다.

<subject> text

  • 명령조의 현재시제를 사용한다. “changed” 나 “changes”가 아닌 “change”사용
  • 첫 글자를 대문자로 적지 않는다
  • 마지막에 마침표를 찍기 않는다.

 

👉 Message body

  • 명령조의 현재시제를 사용한다
  • 변경에 대한 동기나 이전 행동과의 차이를 포함한다.

 

👉 Message footer

Breaking Changes

모든 breaking change들은 푸터에서 변경에 대한 설명, 이유,  migration notes와 함께 언급되어야 한다.

BREAKING CHANGE: isolate scope bindings definition has changed and
    the inject option for the directive controller injection was removed.
    
    To migrate the code follow the example below:
    
    Before:
    
    scope: {
      myAttr: 'attribute',
      myBind: 'bind',
      myExpression: 'expression',
      myEval: 'evaluate',
      myAccessor: 'accessor'
    }
    
    After:
    
    scope: {
      myAttr: '@',
      myBind: '@',
      myExpression: '&',
      // myEval - usually not useful, but in cases where the expression is assignable, you can use '='
      myAccessor: '=' // in directive's template change myAccessor() to myAccessor
    }
    
    The removed `inject` wasn't generaly useful for directives so there should be no code using it.

 

Referencing issues

완료된 버그들은 "Closes" 키워드와 함께 기록되어야 한다.

Closes #234

여러개인 경우에는 다음과 같이 쓸 수 있다.

Closes #123, #245, #992

 

예시


feat($browser): onUrlChange event (popstate/hashchange/polling)

Added new event to $browser:
- forward popstate event if available
- forward hashchange event if popstate not available
- do polling when neither popstate nor hashchange available

Breaks $browser.onHashChange, which was removed (use onUrlChange instead)
fix($compile): couple of unit tests for IE9

Older IEs serialize html uppercased, but IE9 does not...
Would be better to expect case insensitive, unfortunately jasmine does
not allow to user regexps for throw expectations.

Closes #392
Breaks foo.bar api, foo.baz should be used instead
feat(directive): ng:disabled, ng:checked, ng:multiple, ng:readonly, ng:selected

New directives for proper binding these attributes in older browsers (IE).
Added coresponding description, live examples and e2e tests.

Closes #351
style($location): add couple of missing semi colons
docs(guide): updated fixed docs from Google Docs

Couple of typos fixed:
- indentation
- batchLogbatchLog -> batchLog
- start periodic checking
- missing brace
feat($compile): simplify isolate scope bindings

Changed the isolate scope binding options to:
  - @attr - attribute binding (including interpolation)
  - =model - by-directional model binding
  - &expr - expression execution binding

This change simplifies the terminology as well as
number of choices available to the developer. It
also supports local name aliasing from the parent.

BREAKING CHANGE: isolate scope bindings definition has changed and
the inject option for the directive controller injection was removed.

To migrate the code follow the example below:

Before:

scope: {
  myAttr: 'attribute',
  myBind: 'bind',
  myExpression: 'expression',
  myEval: 'evaluate',
  myAccessor: 'accessor'
}

After:

scope: {
  myAttr: '@',
  myBind: '@',
  myExpression: '&',
  // myEval - usually not useful, but in cases where the expression is assignable, you can use '='
  myAccessor: '=' // in directive's template change myAccessor() to myAccessor
}

The removed `inject` wasn't generaly useful for directives so there should be no code using it.
반응형

'etc' 카테고리의 다른 글

[git] 자주 사용하는 git 명령어  (0) 2021.11.23