【问题标题】:Git changelog: how to get all changes up to a specific tag?Git changelog:如何将所有更改添加到特定标签?
【发布时间】:2011-11-15 07:13:49
【问题描述】:

是否有一种简单的方法或命令可以让所有 git 提交到特定标签以生成项目的自动更改日志?我总是用v0.1.0之类的版本号标记我的git repos,例如,我希望所有提交都标记为v0.1.0

我查看了文档,但似乎没有找到有用的选项或命令:http://git-scm.com/docs/git-log(顺便说一句,目前已关闭)

例如:

$ git log --oneline --decorate

在提交旁边显示标签。我想要相同的,但仅限于特定的标签。

【问题讨论】:

标签: git logging changelog


【解决方案1】:

你可以这样做:

git log --oneline --decorate v0.1.0

... 显示直到并包括 v0.1.0 的每个提交。当然,git logallows 还允许您限制以git rev-list 理解的任何方式显示的提交,因此如果您只想查看v0.0.9v0.1.0 之间的更改,您也可以这样做:

git log --oneline --decorate v0.0.9..v0.1.0

可能对此有用的替代输出是git shortlog,它对每个作者的贡献进行分组和总结。试试,例如:

git shortlog v0.1.0

【讨论】:

  • 感谢您的详尽回答 :) 这正是我想要的。
  • 要在特定标签之后显示提交,您可以使用git log --oneline --decorate v0.1.0..
  • 运行 git 命令即 git log --oneline --decorate 后如何复制日志?
  • 如何保存到文件中?
  • @MateusViccari 您将使用带有> 的输出重定向,例如git log --oneline --decorate v0.0.9..v0.1.0 > changes.txt
【解决方案2】:

为了通过标签创建变更日志,我使用了这个脚本:

#!/bin/bash
# Author:Andrey Nikishaev
echo "CHANGELOG"
echo ----------------------
git tag -l | sort -u -r | while read TAG ; do
    echo
    if [ $NEXT ];then
        echo [$NEXT]
    else
        echo "[Current]"
    fi
    GIT_PAGER=cat git log --no-merges --format=" * %s" $TAG..$NEXT
    NEXT=$TAG
done
FIRST=$(git tag -l | head -1)
echo
echo [$FIRST]
GIT_PAGER=cat git log --no-merges --format=" * %s" $FIRST

【讨论】:

  • 如果您的标签是 x.y.z 格式的版本,请将 -V 标志添加到 sort 以正确排序 1.0.9、1.0.10 等版本。
【解决方案3】:

有一个非常有用的gem,输出是用markdown写的,添加issue支持和按标签拆分提交

https://github.com/kebab-project/katip

【讨论】:

    【解决方案4】:

    Creotiv 建议对脚本进行更新以更好地对标签进行排序

    #!/bin/bash
    # Author:Andrey Nikishaev, Gunnar Lindholm
    echo "CHANGELOG"
    echo ----------------------
    git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags |tac |grep -v '^$' | while read TAG ; do
         echo
        if [ $NEXT ];then
            echo [$NEXT]
        else
            echo "[Current]"
        fi
        GIT_PAGER=cat git log --no-merges --format=" * %s" $TAG..$NEXT
        NEXT=$TAG
    done
    FIRST=$(git tag -l | head -1)
    echo
    echo [$FIRST]
    GIT_PAGER=cat git log --no-merges --format=" * %s" $FIRST
    

    【讨论】:

      【解决方案5】:

      我想出了对原始脚本的这种修改。这会正确处理版本标签。

      #!/bin/bash
      # Author:Andrey Nikishaev
      echo "CHANGELOG"
      echo ----------------------
      git tag -l --sort=v:refname | tac | while read TAG ; do
          echo
          if [ $NEXT ];then
              echo [$NEXT]
          else
              echo "[Current]"
          fi
          GIT_PAGER=cat git log --no-merges --format=" * %s" $TAG..$NEXT
          NEXT=$TAG
      done
      FIRST=$(git tag -l --sort=v:refname | head -1)
      echo
      echo [$FIRST]
      GIT_PAGER=cat git log --no-merges --format=" * %s" $FIRST
      

      【讨论】:

        【解决方案6】:

        只需将 tagname 附加到您的命令中,您应该没问题 :) 我喜欢 --graph 开关来可视化导致该标签的分支:)

        【讨论】:

          【解决方案7】:

          只需使用标签名称作为提交说明符:git log --oneline --decorate v0.1.0

          【讨论】:

            【解决方案8】:

            您可以使用Git Changelog Command Line 来执行此操作:

            npx git-changelog-command-line -std -tr v0.1.0 -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}}
            "
            

            【讨论】:

              【解决方案9】:

              使用https://pypi.org/project/changelogfromtags/

              pip install changelogfromtags && changelogfromtags
              

              【讨论】:

                猜你喜欢
                • 2023-02-09
                • 1970-01-01
                • 1970-01-01
                • 2017-11-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-09-16
                • 2015-01-25
                相关资源
                最近更新 更多