235

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

いずれにせよ、私たちはいくつかの勢いを増し始めており、前回のリリースからの変更点を人々に見せることができれば本当に良いと思いました. 問題は、変更ログを維持していないことです。なぜなら、どうすればいいのかよくわからないからです。この特定の時間については、ログを調べて手動でログを作成できますが、すぐに疲れてしまいます。

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

私が見逃している標準的なアプローチはありますか?それとも、これは誰もが独自のことを行う領域ですか?

4

11 に答える 11

199

これは 2015 年のことですが、将来の検索者のために、次の方法で豪華なログを生成できるようになりました。

git log --oneline --decorate

または、さらにきれいにしたい場合 (端末に色を付けて):

git log --oneline --decorate --color

その出力をChangeLogにパイプすることは、私が現在すべてのプロジェクトで使用しているものであり、単純に驚くべきことです。

于 2014-03-18T22:30:40.637 に答える
65

あなたを助けるためにいくつかの風味を使うことができますgit log

git log --pretty=%s                 # Only prints the subject

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

git log --pretty=%s --first-parent  # Only follow the 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 が実際にどれだけ役立つかは、完全にはわかりません。「管理」の意味を誤解しているのかもしれません。

于 2010-08-19T20:42:39.197 に答える
64

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

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

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

必要に応じて、いくつかの分類 (新しいもの、変更、バグ修正など) が必要になる場合があります。

これらすべてを念頭に置いて、gitchangelogを作成して使用しました。これは、 Git コミット メッセージ規則を活用して、以前のすべての目標を達成することを目的としています。

素敵な変更ログを作成するためには、コミット メッセージの規約が必須です (を使用するかどうかに関係なくgitchangelog)。

コミットメッセージ規約

以下は、コミットメッセージに追加することについて考えるのに役立つ可能性のある提案です。

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

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

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

  • 変更ログに出力されるべきではない「マイナーな」コミットとして (表面的な変更、コメントの小さなタイプミスなど)
  • 重要な機能の変更が実際にない場合は、「リファクタリング」として。したがって、これは、たとえば、最終ユーザーに表示される変更ログの一部であってはなりませんが、開発者の変更ログがある場合は、興味深いかもしれません。
  • APIの変更や新しいAPIのものをマークするために、「API」でタグ付けすることもできます...
  • ...等...

できるだけ頻繁にユーザー (機能) をターゲットにして、コミット メッセージを書くようにしてください。

これは、この情報を保存する方法を示す標準ですgit log --oneline::

* 5a39f73 fix: encoding issues with non-ASCII characters.
* 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、未加工の Python で記述されたデフォルトのレガシー エンジンを備えています。現在の 3 つのエンジンにはすべて、それらの使用方法の例があり、変更ログをgitchangelogの PyPI ページに表示されるものとして出力できます。

git log他にもたくさんのchangelogツールがあることを知っていると思います。

免責事項:私はgitchangelogの作成者であり、これについて以下で説明します。

于 2014-04-13T20:13:14.283 に答える
30

より的確な変更ログ:

git log --since=1/11/2011 --until=28/11/2011 --no-merges --format=%B
于 2011-11-28T10:07:34.113 に答える
24

この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、プロジェクトの 1 つのトップレベルで次のルールを使用しています。

.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には、記録された最新のコミットの SHA-1 識別子が含まれてChangeLogおり、Git リポジトリに保存されます。 ChangeLogリポジトリにも記録されるため、コミットメッセージを変更せずに編集できます (タイプミスを修正するなど)。

于 2013-05-24T15:24:19.043 に答える
22

バージョンごとにタグを作成するのがベスト プラクティスであるため、変更ログをバージョンごとに分割することをお勧めします。その場合、次のコマンドが役立ちます。

git log YOUR_LAST_VERSION_TAG..HEAD --no-merges --format=%B
于 2012-09-19T13:47:38.383 に答える
10

このためのライブラリも作成しました。Mustacheテンプレートで完全に構成可能です。ができる:

  • CHANGELOG.mdなどのファイルに保存されます。
  • MediaWikiに投稿される
  • または、標準出力に出力するだけです

私も作った:

詳細は 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}}
"

またはジェンキンスで:

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

于 2015-12-08T12:57:54.377 に答える
4

GNU スタイルの変更ログ

GNU スタイルの changelogの場合、関数をクックしました。

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 コミット データを複製しても意味がありません。

変更ログを作成する場合は、 Keep a Changelogで指定されているように、何が起こっているかを適切にまとめたものにしてください。

于 2015-07-24T09:27:28.700 に答える
3
git log --oneline --no-merges `git describe --abbrev=0 --tags`..HEAD | cut -c 9- | sort

私が使用するのが好きなものです。最後のタグ以降のすべてのコミットを取得します。cutコミット ハッシュを取り除きます。コミット メッセージの冒頭でチケット番号を使用すると、それらは でグループ化されsortます。fix特定のコミットの前にtypo、 などを付けると、並べ替えも役立ちます。

于 2015-12-08T15:39:12.503 に答える
3

CICHANGELOGサーバーに、リリース ファイル名に設定された日付を使用して、新しいリリースごとに名前を付けたファイルに次をパイプさせます。

git log --graph --all --date=relative --pretty=format:"%x09 %ad %d %s (%aN)"
于 2016-10-01T15:34:54.957 に答える