gitを使用して変更ログを管理する良い方法は?


214

私はしばらくGitを使用していますが、最近、変更を追跡しやすく、各クライアントが実行しているバージョンを確認できるように、リリースにタグを付けるためにそれを使用し始めました(残念ながら、現在コードで義務付けられています)各クライアントが独自のPHPサイトのコピーを持っていることを変更します。

いずれにせよ、私たちは勢いをつけ始めています。前回のリリース以降に何が変わったかを人々に示すことができれば本当にいいと思いました。問題は、どうすればよいかわからないため、変更ログを維持していないことです。この特定の時間に、ログを実行して手動でログを作成できますが、すぐに疲れるでしょう。

「git changelog」と「git manage changelog」をグーグルで検索してみましたが、コード変更のワークフローと、changelogとどのように一致するかについて実際に語っている内容は見つかりませんでした。私たちは現在、Rein Henrichsの開発ワークフローに従っているので、それに沿ったものが好きです。

私が欠けている標準的なアプローチはありますか、またはこれは誰もが自分のことをする領域ですか?

コメント/回答ありがとうございます!

回答:


181

これは約3〜4年前ですが、将来の検索者のために、次のようにして豪華なログを生成することが可能になりました。

git log --oneline --decorate

または、さらにきれいにしたい場合は(端末の色を指定):

git log --oneline --decorate --color

ChangeLogへの出力のパイピングは、現在すべてのプロジェクトで使用しているものです。


4
もう1つの便利なタグは--graphで、コミットがオンになっているブランチを視覚的に示します。
Eruant 14

44
ギフトログの差分を変更ログとして使用しないことを強くお勧めします:keepachangelog.com
Olivier Lacan 14

4
git log出力をchangelogにコピーしても意味がありません。読み取りと変更のログを取得するには、フィルタリングと編集の作業を行う必要があります。それ以外の場合、変更ログが必要なのはなぜですか。変更ログの生成は自動化できると思いますが、の生のコピーは行わないでくださいgit log
vaab 2015年

19
これの問題は、プロジェクトのすべての貢献者が明確で読み取り可能なコミットメッセージを書き込むと仮定しても、大量のノイズを含む「変更ログ」が生成されることです。変更ログは、リリース間で発生したそれらに関連する注目すべき変更をプロジェクトのユーザーに説明することを目的として作成する必要があります。一方、コミットメッセージは、コミットがコードに対して行った改善を開発者に説明することに重点を置く必要があります。オーバーラップが時々ありますが、常にではありません。
Ajedi32

7
または、もう少し具体的にするために、このメソッドは、「ZModuleのfooMethodの固定スペル」や「新しいバージョンのXYLibararyを使用するようにXModuleをリファクタリングする」などの多くのエントリを含む「変更ログ」を作成します。ユーザーはそれを気にしません。彼らは、変更がから作られたかを知りたい自分、ユーザーとしての視点ではない、あなたの開発者としての視点を。そして、それは「Merge PR#123 from xdev / foo」や「Opps、fixed newFeature so it it実際に機能する」タイプのものを無視しているだけで、現実世界のリポジトリに存在する可能性があります。
Ajedi32

60

あなたはあなたを助けるためにgitログのいくつかのフレーバーを使うことができます:

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

ブランチに適切な名前を付けて、マスターへのマージが「Merged branch feature-foobar」のように表示されるようにすると、そのメッセージのみを表示し、マージしたすべての小さなコミットではなく、それらをまとめて短くすることができます。特徴:

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

これを独自のスクリプトで補強して、「マージされたブランチ」ビットを削除したり、フォーマットを正規化したりすることができます。もちろん、いつか自分で記述する必要があります。

次に、バージョンごとに1回、変更ログの新しいセクションを作成できます。

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

あなたのバージョンリリースのコミットでそれをコミットしてください。

あなたの問題がそれらのコミット対象が変更ログに入れたいものと似ていないことである場合、あなたはほとんど2つの選択肢があります:すべてを手動で行うことを続ける(そしてキャッチを再生する代わりにそれをより定期的に続けようとします-リリース時にアップ)、またはコミットメッセージスタイルを修正します。サブジェクトがそれを行わない場合の1つのオプションは、コミットメッセージの本文に「変更:追加された機能foobar」のような行を配置することです。そうすれば、後でgit log --pretty=%B | grep ^change:これらのスーパーのみを取得するようなことができます-メッセージの重要なビット。

gitが変更ログの作成に本当にどれだけ役立つかは、完全にはわかりません。多分私はあなたが「管理」によって何を意味するのかを誤って解釈したのでしょうか?


2
それは間違いなく素晴らしいスタートであり、後で修正できるようにボディにモディファイヤを追加することは考えていませんでした。それは私がやっていることかもしれません。フィードバックをお寄せいただきありがとうございます!翌日ほどで回答が届かない場合は、回答としてマークします:-)
Topher Fangio

60

免責事項私はgitchangelogの作成者ですが、以下で説明します。

TL; DR:gitchangelog自体の変更ログ、または以前に生成されたASCII出力を確認することをお勧めします。

git履歴から変更ログを生成する場合は、おそらく次のことを考慮する必要があります。

  • 出力形式。(純粋なカスタムASCII、Debian changelogタイプ、Markdow、ReST ...)
  • いくつかのコミットフィルタリング(おそらく、すべてのタイプミスや表面的な変更が変更ログに記録されるのを見たくないでしょう)
  • 変更ログに含まれる前に、いくつかのコミットテキストがラングリングします。(最初の文字が大文字または最後のドットがあるようにメッセージの正規化を確実にしますが、要約からいくつかの特別なマークアップを削除することもできます)
  • あなたのgit履歴は互換性がありますか?マージ、タグ付けは、ほとんどのツールで常に簡単にサポートされるわけではありません。履歴の管理方法によって異なります。

オプションとして、いくつかの分類(新しいもの、変更、バグ修正)が必要な場合があります...

これらすべてを念頭に置いて、gitchangelogを作成して使用しました。これは、前の目標をすべて達成するためにgit commit message規約を活用するためのものです。

素敵な変更ログを作成するためには、コミットメッセージの規則が必須です(を使用してもしなくてもgitchangelog)。

コミットメッセージ規約

以下は、コミットメッセージに追加することについて考えるのに役立つかもしれないものへの提案です。

大まかにコミットを大きなセクションに分けたいかもしれません:

  • 意図による(例:新規、修正、変更...)
  • オブジェクト(例:doc、パッケージング、コード...)
  • 対象者(例:開発者、テスター、ユーザーなど)

さらに、いくつかのコミットにタグを付けることができます:

  • 変更ログに出力されるべきではない「マイナー」なコミットとして(見た目の変更、コメントの小さなタイプミス...)
  • 重要な機能変更が実際にない場合は、「リファクタリング」として。したがって、これは、たとえば最終ユーザーに表示される変更ログの一部であるべきではありませんが、開発者の変更ログがある場合は、興味深いかもしれません。
  • 「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完全な変更ログを生成し(セクショニングサポートはNewFix...など)、独自のコミット規則に適度に設定できます。を介したテンプレート化によりMustache、あらゆるタイプの出力をサポートしMako templating、未加工のpythonで記述されたデフォルトのレガシーエンジンを備えています。現在の3つのエンジンにはすべて、それらの使用例があり、gitchangelogのPyPIページに表示されるものとして、変更ログを出力できます。

私は、あなたが他の多くがあることを知っているよgit logchangelogもそこのツール。


1
これはすごい、まさに私が探していたものです。やってみます、ありがとうございました!
ジェフKiiza 2017年


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の発電機

タグのクローズされた問題とマージされたプルリクエストから変更ログを生成します。

このCHANGELOG.mdは、このスクリプトによって生成されました。

例:

変更ログ

1.2.5(2015年1月15日)

完全な変更ログ

実装された拡張機能:

  • マイルストーンを使用して、バグが修正されたバージョンを指定する#22

修正されたバグ:

  • タグなしでリポジトリのログを生成しようとしたときのエラー#32

マージされたプルリクエスト:

  • PrettyPrintクラスは小文字の 'pp'を使用してインクルードされます#43schwing

  • コマンドラインオプションを介してエンタープライズgithubをサポート#42glenlovett


そのようなプロジェクトは最高です:)それを行う動機は何でしたか?また、私は似ツールを作ったあなたのインスピレーションのおかげで、ラベルのないその仕事、追加/変更/ /固定取り除き、PHP(私の「ネイティブ」言語)であるに分割:github.com/Symplify/ChangelogLinker Doが、あなたはChanglogsについての記事を書きます?私はそれらを読みたい
トマーシュVotruba

1
@TomášVotruba暖かい言葉をありがとう。ただの趣味です。あまり投稿しませんでした。しかし、それは価値があると思います。ご多幸を祈る!
スカイワインダー

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}}
"

またはジェンキンスで:

ここに画像の説明を入力してください


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

使いたいものです。最後のタグ以降のすべてのコミットを取得します。cutコミットハッシュを取り除きます。コミットメッセージの先頭にチケット番号を使用すると、それらはでグループ化されsortます。ソートは、特定のコミットの前fixtypo、などを付ける場合にも役立ちます。


3

CIサーバーに、次のパイプを使用して、CHANGELOG新しいリリースごとに名前が付けられたファイルに、日付をrelease-filenameに設定してパイプします。

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

2

以下のために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
}

これとともに:

  • ChangeLogの最終編集を行う前に、変更を定期的にコミットしてバックアップおよびリベースします
  • 次に実行します: gnuc

そして今私のクリップボードには次のようなものが含まれています:

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

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

次に、クリップボードを開始点として使用して、ChangeLogを更新します。

これは、(例えば、ファイルがそう、彼らのChangeLogの相対パスでなければなりません完璧ではありませんpython/py-symtab.cせずにgdb/、私が編集されますので、gdb/ChangeLog)が、良い開始点です。

より高度なスクリプト:

Tromeyに同意する必要があります:ChangeLogでgit commit dataを複製するのは役に立ちません。

変更ログを作成する場合は、おそらくhttp://keepachangelog.com/で指定されているように、何が行われているのかを適切に要約してください。


2

bithavocに基づいて、それはlast tagまでリストしますHEAD。しかし、私は2つのタグの間にログをリストしたいと思っています。

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

2つのタグの間にログをリストします。

// 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.