git을 사용하여 변경 로그를 관리하는 좋은 방법?


214

나는 잠시 동안 Git을 사용 해 왔으며 최근에 변경 사항을보다 쉽게 ​​추적하고 각 클라이언트가 실행중인 버전을 볼 수 있도록 릴리스에 태그를 지정하기 위해 최근에 사용하기 시작했습니다 (불행히도 현재 코드가 요구합니다) 각 클라이언트에는 자체 PHP 사이트 사본이 있습니다.이를 변경하고 있지만 느리게 진행됩니다).

어쨌든, 우리는 약간의 추진력을 구축하기 시작했습니다. 저는 지난 릴리스 이후 변경된 사항을 사람들에게 보여줄 수 있다는 것이 정말 좋을 것이라고 생각했습니다. 문제는 변경 방법을 잘 모르기 때문에 변경 로그를 유지하지 않았다는 것입니다. 이 특정 시간 동안 로그를 살펴보고 수동으로 로그를 만들 수는 있지만 매우 빨리 지칠 것입니다.

나는 "git changelog"와 "git manage changelog"인터넷 검색을 시도했지만 실제로 코드 변경 작업 과정과 변경 로그와 일치하는 방법에 대해 이야기 한 것을 찾지 못했습니다. 우리는 현재 Rein Henrichs의 개발 워크 플로를 따르고 있으며 그와 함께하는 것을 좋아합니다.

내가 놓친 표준 접근법이 있습니까, 아니면 모든 사람이 자신의 일을하는 영역입니까?

귀하의 의견 / 답변에 감사드립니다!

답변:


181

이것은 약 3-4 년 전이지만 미래의 검색자를 위해 다음을 사용하여 멋진 로그를 생성 할 수 있습니다.

git log --oneline --decorate

또는 더 예쁘기를 원한다면 (터미널 색상으로) :

git log --oneline --decorate --color

그 출력을 ChangeLog로 파이프하는 것은 현재 모든 프로젝트에서 사용하는 것입니다.


4
또 다른 유용한 태그는 --graph커밋이 어느 분기에 있는지 시각적으로 보여줍니다.
Eruant

44
: 나는 강력하게 CHANGELOG로 선물 로그 차이점을 이용하여 무리를 줄 것이다 keepachangelog.com
올리비에 라캉

4
git log출력을 변경 로그에 복사하는 것은 의미가 없습니다. 읽을 수있는 변경 로그를 가지려면 필터링 및 편집 작업을 수행해야합니다. 그렇지 않으면 변경 로그가 필요한 이유는 무엇입니까? 변경 로그 생성을 자동화 할 수는 있지만 원시 사본을 작성하지 마십시오 git log!
vaab

19
이것의 문제점은 프로젝트의 모든 제공자가 명확하고 읽을 수있는 커밋 메시지를 작성한다고 가정하더라도 여전히 노이즈가 많은 "changelog"를 생성한다는 것입니다. 변경 기록이에게 설명의 목적으로 작성해야 사용자가 당신의 프로젝트의 주목할만한 변화 그들에게 관련 자료 사이에 발생한 반면, 메시지가 설명에 집중해야한다 커밋 개발자 당신의 차종 투입 무엇을 개선 코드에를 . 때로는 겹치는 부분이 있지만 항상 그런 것은 아닙니다.
Ajedi32

7
또는 좀 더 구체적으로하기 위해이 방법은 "ZModule에서 fooMethod의 수정 철자"및 "XYLibarary의 새 버전을 사용하도록 XModule 리팩터링"과 같은 많은 항목을 포함하는 "변경 로그"를 작성합니다. 당신의 사용자 그것에 관심이 없습니다 . 그들은 변경 만든 있었는지 알고 싶어 자신의 사용자로 입장하지 귀하의 개발자로 관점을. 그리고 심지어 "xdev / foo에서 PR # 123 병합"및 "실제로 작동하도록 수정 된 newFeature 수정"과 같은 항목은 무시합니다.
Ajedi32

60

git log의 풍미를 사용하여 도움을 줄 수 있습니다.

git log --pretty=%s                 # only print the subject

브랜치의 이름을 잘 지정하여 마스터와의 병합이 "병합 브랜치 기능 -foobar"와 같이 표시되면 병합 한 모든 커밋이 아니라 메시지 만 표시하여 사물을 줄일 수 있습니다. 특색:

git log --pretty=%s --first-parent  # only follow first parent of merges

"병합 된 분기"비트를 제거하고 서식을 정규화하는 등의 작업을 수행 할 수있는 자체 스크립트를 사용하여이 기능을 보강 할 수 있습니다. 어떤 시점에서는 물론 직접 작성해야합니다.

그런 다음 버전 당 한 번 변경 로그에 대한 새 섹션을 만들 수 있습니다.

git log [opts] vX.X.X..vX.X.Y | helper-script > changelogs/X.X.Y

버전 릴리스 커밋에서 커밋하십시오.

문제가 커밋 대상이 변경 로그에 넣기를 원하는 것과 다른 것이 아니라면 두 가지 옵션이 있습니다. 수동으로 모든 것을 수동으로 수행하십시오 (그리고 캐치를 재생하는 대신 더 정기적으로 유지하십시오) 커밋 메시지 스타일을 수정하십시오. 주제가 당신을 위해 그것을하지 않을 경우 한 가지 옵션은 커밋 메시지의 본문에 "change : added feature foobar"와 같은 줄을 배치하여 나중에 git log --pretty=%B | grep ^change:그 슈퍼 만 잡는 것과 같은 일 을 할 수 있도록하는 것입니다 -메시지의 중요한 비트.

나는 그 자식보다 얼마나 많은 것이 변경 로그를 만드는 데 실제로 도움이 될 수 있는지 확실하지 않습니다. "관리"의 의미를 잘못 해석했을 수도 있습니다.


2
그것은 분명히 좋은 출발이며, 나중에 몸을 붙일 수 있도록 수정자를 몸에 추가하는 것에 대해서는 생각하지 않았습니다. 그것은 내가하고있는 일일 수 있습니다. 피드백 감사드립니다! 다음 날에 더 이상 답변이 나오지 않으면 답변으로 표시하겠습니다. :-)
Topher Fangio

60

면책 조항 : 나는 gitchangelog 의 저자이며 다음에서 이야기 할 것입니다.

TL; DR : gitchangelog 자체의 변경 로그 또는 이전을 생성 한 ASCII 출력 을 점검 할 수 있습니다 .

git history에서 변경 로그를 생성하려면 다음을 고려해야합니다.

  • 출력 형식 . (순수한 사용자 정의 ASCII, 데비안 변경 로그 유형, Markdow, ReST ...)
  • 일부 커밋 필터링 (아마도 변경 내용에 오타 또는 외형 변경 사항이 모두 표시되는 것을 원하지 않습니다)
  • 일부는 텍스트 논쟁을 커밋 변경 로그에 포함되기 전에. (첫 글자 대문자 또는 마지막 점이있는 메시지를 정규화하지만 요약에서 일부 특수 마크 업을 제거 할 수 있음)
  • 당신입니다 자식 역사는 호환 ?. 대부분의 도구에서 병합, 태그 지정이 항상 그렇게 쉽게 지원되는 것은 아닙니다. 당신의 역사를 어떻게 관리 하느냐에 달려 있습니다.

선택적으로 일부 분류 (새로운 것, 변경 사항, 버그 수정)를 원할 수 있습니다 ...

이 모든 것을 염두에두고 gitchangelog를 만들고 사용 했습니다 . 이전 목표를 모두 달성하기 위해 자식 커밋 메시지 규칙 을 활용 하기위한 것입니다.

커밋 메시지 규칙이 있어야 멋진 변경 로그를 만들 수 있습니다 (사용 여부에 관계없이 gitchangelog).

메시지 컨벤션 커밋

다음은 커밋 메시지 추가에 대해 생각할 때 유용한 제안입니다.

대략 커밋을 큰 섹션으로 분리하고 싶을 수도 있습니다.

  • 의도적으로 (예 : 신규, 수정, 변경 ...)
  • 개체 별 (예 : 문서, 패키징, 코드 ...)
  • 잠재 고객 별 (예 : 개발자, 테스터, 사용자 ...)

또한 일부 커밋에 태그를 지정할 수 있습니다.

  • "사소한"커밋으로 변경 로그에 출력해서는 안됩니다 (화장품 변경, 의견의 작은 오타 ...)
  • 중요한 기능 변경 사항이없는 경우 '리 팩터'로 따라서 이것은 예를 들어 최종 사용자에게 표시되는 변경 로그의 일부가 아니어야하지만 개발자 변경 로그가있는 경우 관심이있을 수 있습니다.
  • API 변경 사항이나 새로운 API를 표시하기 위해 "api"로 태그를 지정할 수도 있습니다.
  • ...기타...

가능한 한 자주 사용자 (기능)를 대상으로 커밋 메시지를 작성하십시오.

다음은 git log --oneline이러한 정보를 저장하는 방법을 보여주는 표준입니다.

* 5a39f73 fix: encoding issues with non-ascii chars.
* a60d77a new: pkg: added ``.travis.yml`` for automated tests. 
* 57129ba new: much greater performance on big repository by issuing only one shell command for all the commits. (fixes #7)
* 6b4b267 chg: dev: refactored out the formatting characters from GIT.
* 197b069 new: dev: reverse ``natural`` order to get reverse chronological order by default. !refactor 
* 6b891bc new: add utf-8 encoding declaration !minor 

알다시피, 내가 선택한 형식은 다음과 같습니다.

{new|chg|fix}: [{dev|pkg}:] COMMIT_MESSAGE [!{minor|refactor} ... ]

실제 출력 결과를 보려면 gitchangelog 의 PyPI 페이지 끝을 볼 수 있습니다

커밋 메시지 규칙에 대한 전체 문서를 보려면 참조 파일 gitchangelog.rc.reference를 볼 수 있습니다.

이것으로부터 절묘한 변경 로그를 생성하는 방법

그런 다음 완전한 변경 로그를 작성하는 것은 매우 쉽습니다. 직접 스크립트를 만들거나을 사용할 수 있습니다 gitchangelog.

gitchangelog전체 변경 로그를 생성하고 (섹션 지원 New, Fix...) 자신의 커밋 규칙으로 합리적으로 구성 할 수 있습니다. Mustache,를 통한 템플릿 화 덕분에 모든 유형의 출력을 지원하며 Mako templating원시 파이썬으로 작성된 기본 레거시 엔진이 있습니다. 현재 3 개의 모든 엔진에는 사용 방법에 대한 예제가 있으며 gitchangelog의 PyPI 페이지에 표시된 것과 같이 변경 로그를 출력 할 수 있습니다.

나는 거기 git logchangelog도구 가 많이 있다는 것을 알고 있다고 확신합니다 .


1
내가 찾던 것이 굉장합니다. 나는 이것을 시도 할 것이다, 너무 감사합니다!
Jeff Kiiza


23

gitlog-to-changelog스크립트는 GNU 스타일을 생성하는 데 편리합니다ChangeLog .

로 표시된 것처럼 다음 옵션 중 하나를 사용하여 파일 gitlog-to-changelog --help을 생성하는 데 사용되는 커밋을 선택할 수 ChangeLog있습니다 --since.

gitlog-to-changelog --since=2008-01-01 > ChangeLog

또는에 추가 인수를 --전달하면 git-log(내부적으로에 의해 호출 됨 gitlog-to-changelog) :

gitlog-to-changelog -- -n 5 foo > last-5-commits-to-branch-foo

예를 들어, Makefile.am프로젝트 중 하나의 최상위 레벨에서 다음 규칙을 사용하고 있습니다.

.PHONY: update-ChangeLog
update-ChangeLog:
    if test -d $(srcdir)/.git; then                         \
       $(srcdir)/build-aux/gitlog-to-changelog              \
          --format='%s%n%n%b%n' --no-cluster                \
          --strip-tab --strip-cherry-pick                   \
          -- $$(cat $(srcdir)/.last-cl-gen)..               \
        >ChangeLog.tmp                                      \
      && git rev-list -n 1 HEAD >.last-cl-gen.tmp           \
      && (echo; cat $(srcdir)/ChangeLog) >>ChangeLog.tmp    \
      && mv -f ChangeLog.tmp $(srcdir)/ChangeLog            \
      && mv -f .last-cl-gen.tmp $(srcdir)/.last-cl-gen      \
      && rm -f ChangeLog.tmp;                               \
    fi

EXTRA_DIST += .last-cl-gen

이 규칙은 릴리스시 ChangeLog아직 기록되지 않은 최신 커밋 메시지 로 업데이트 하는 데 사용됩니다 . 파일 .last-cl-gen에는 기록 된 최신 커밋의 SHA1 식별자가 포함되어 ChangeLog있으며 Git 리포지토리에 저장됩니다. ChangeLog또한 커밋 메시지를 변경하지 않고 편집 (예 : 오타 수정) 할 수 있도록 리포지토리에 기록됩니다.


GCC mklog 스크립트도 흥미로울 수 있습니다 : stackoverflow.com/a/31606865/895245
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

이기는 프로젝트입니다! 왜 github에 없습니까?
Omer Dagan

20

버전마다 태그를 작성하는 것이 가장 좋으므로 버전별로 변경 로그를 분할 할 수 있습니다. 이 경우이 명령이 도움이 될 수 있습니다.

git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B

15

대한 GitHub의 프로젝트가 유용 할 수 있습니다 : GitHub의 변경 로그 발전기

태그 닫힌 문제 및 병합 된 풀 요청에서 변경 로그를 생성합니다.

CHANGELOG.md 는이 스크립트에 의해 생성되었습니다.

예:

변경 로그

1.2.5 (2015-01-15)

전체 변경 내역

개선 된 기능 :

  • 마일스톤을 사용하여 수정 된 버전 버그 지정 # 22

수정 된 버그 :

  • 태그 # 32 없이 저장소에 대한 로그를 생성하려고 할 때 오류가 발생했습니다.

병합 된 풀 요청 :

  • PrettyPrint 클래스는 소문자 'pp' # 43 ( schwing )을 사용하여 포함됩니다

  • 명령 행 옵션 # 42 ( glenlovett ) 를 통해 엔터프라이즈 github 지원


그러한 프로젝트는 최고입니다 :) 당신의 동기는 무엇입니까? 또한 영감을 얻은 덕분에 레이블없이 작동하고 추가 / 변경 / 고정 / 제거로 분리되어 PHP (내 "기본"언어)로 된 유사한 도구를 만들었습니다. github.com/Symplify/ChangelogLinker Changlogs 에 대한 게시물을 작성하십니까 ? 내가 그들을 읽고 싶습니다
토마스 Votruba에게

1
@ TomášVotruba 따뜻한 단어 주셔서 감사합니다. 그냥 내 취미 야 많이 게시하지 않았습니다. 그러나 나는 그만한 가치가 있다고 생각합니다. 최고의 소원!
skywinder

10

나는 또한 이것을 위해 도서관을 만들었다. Mustache 템플릿으로 완벽하게 구성 할 수 있습니다. 그것은 할 수 있습니다 :

나는 또한 만들었다 :

Github에 대한 자세한 내용 : https://github.com/tomasbjerre/git-changelog-lib

명령 행에서 :

npx git-changelog-command-line -std -tec "
# Changelog

Changelog for {{ownerName}} {{repoName}}.

{{#tags}}
## {{name}}
 {{#issues}}
  {{#hasIssue}}
   {{#hasLink}}
### {{name}} [{{issue}}]({{link}}) {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
   {{/hasLink}}
   {{^hasLink}}
### {{name}} {{issue}} {{title}} {{#hasIssueType}} *{{issueType}}* {{/hasIssueType}} {{#hasLabels}} {{#labels}} *{{.}}* {{/labels}} {{/hasLabels}}
   {{/hasLink}}
  {{/hasIssue}}
  {{^hasIssue}}
### {{name}}
  {{/hasIssue}}

  {{#commits}}
**{{{messageTitle}}}**

{{#messageBodyItems}}
 * {{.}} 
{{/messageBodyItems}}

[{{hash}}](https://github.com/{{ownerName}}/{{repoName}}/commit/{{hash}}) {{authorName}} *{{commitTime}}*

  {{/commits}}

 {{/issues}}
{{/tags}}
"

또는 Jenkins에서 :

여기에 이미지 설명을 입력하십시오


3
git log --oneline --no-merges `git describe --abbrev=0 --tags`..HEAD | cut -c 9- | sort

내가 사용하고 싶은 것입니다. 마지막 태그 이후 모든 커밋을 가져옵니다. cut커밋 해시를 제거합니다. 커밋 메시지의 시작 부분에 티켓 번호를 사용하는 경우 티켓 번호가로 그룹화됩니다 sort. 당신이 특정 커밋 앞에 경우도 정렬하는 데 도움이 fix, typo


3

CI 서버 CHANGELOG가 release-filename에 날짜가 설정된 각 새 릴리스의 이름 을 가진 파일로 다음을 파이프하도록했습니다 .

>git log --graph --all --date=relative --pretty=format:"%x09 %ad %d %s (%aN)"

2

A에 대한 GNU 스타일의 변경 로그 , 나는 기능을 요리 한

gnuc() {
  {
    printf "$(date "+%Y-%m-%d")  John Doe  <john.doe@gmail.com>\n\n"
    git diff-tree --no-commit-id --name-only -r HEAD | sed 's/^/\t* /'
  } | tee /dev/tty | xsel -b
}

이것으로 :

  • 변경 로그를 최종 편집하기 전에 변경 사항을 정기적으로 백업하고 리베이스합니다.
  • 그런 다음 다음을 실행하십시오. gnuc

이제 내 클립 보드에는 다음과 같은 내용이 포함되어 있습니다.

2015-07-24  John Doe  <john.doe@gmail.com>

        * gdb/python/py-linetable.c (): .
        * gdb/python/py-symtab.c (): .

그런 다음 클립 보드를 시작점으로 사용하여 변경 로그를 업데이트합니다.

완벽하지는 않지만 (예를 들어 파일은 ChangeLog 경로와 관련이 있어야하므로 편집 python/py-symtab.c하지 gdb/않으므로 gdb/ChangeLog) 좋은 출발점입니다.

고급 스크립트 :

그래도 Tromey에 동의해야합니다 .ChangeLog에서 git commit 데이터를 복제하는 것은 쓸모가 없습니다.

변경 로그를 작성하려면 http://keepachangelog.com/에 지정된대로 진행 상황을 잘 요약하십시오.


2

를 기반으로 bithavoc , 그것은을 나열 last tag할 때까지 HEAD. 그러나 두 태그 사이의 로그를 나열하고 싶습니다.

// 2 or 3 dots between `YOUR_LAST_VERSION_TAG` and `HEAD`
git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B

두 태그 사이에 로그를 나열합니다.

// 2 or 3 dots between 2 tags
git log FROM_TAG...TO_TAG

예를 들어에서 v1.0.0로 로그를 나열 합니다 v1.0.1.

git log v1.0.0...v1.0.1 --oneline --decorate

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.