git-diff - 使用 --numstat 和 --name-status 运行 git diff-tree

标签 git-diff git

我正在编写一个脚本来分析对 git repo 所做的更改。
在某些时候,我需要遍历所有提交并获取有关每个提交的这些信息:

  • 提交 ID
  • 日期
  • 提交消息
  • ...
  • 文件已更改
  • 文件名
  • 更改类型(添加/修改/删除/重命名)
  • 新文件名(如果更改类型为“重命名”)
  • 添加的行数
  • 移除的行数

  • 我通过 git log 获得提交消息和日期.我遇到的问题是文件。

    如果我不想收集添加/删除的行数,我只需使用
    git diff-tree --no-commit-id --name-status -M -r abcd12345
    

    输出将类似于
    A   Readme.md
    M   src/something.js
    D   src/somethingelse.js
    R100    tests/a/file.js tests/b/file.js
    

    我可以以编程方式解析和阅读。

    要获取有关添加/删除的行的信息,我可以使用:
    git diff-tree -M -r --numstat abcd12345
    

    输出将是这样的:
    abcd12345
    82  0   Readme.md
    41  98  src/something.js
    0   64  src/somethingelse.js
    0   0   tests/{a => b}/file.js
    

    对于重命名的文件,这不是机器可读的。

    我的问题是:有没有办法将这两个命令结合起来?好像不能用--numstat--name-status .

    我可以运行两个单独的命令并将结果 merge 到我的脚本中。在这种情况下,是否还有其他开关可以用来使第二个命令的结果更具机器可读性?

    谢谢。

    最佳答案

    我认为您的分析(您需要两个单独的命令)是正确的。使用 -z使用 --numstat 获得机器可读的输出(这会禁用花哨的重命名编码和所有特殊字符引用),但请注意,您将不得不在 ASCII NUL 处将行分开,而不是换行符。

    关于git-diff - 使用 --numstat 和 --name-status 运行 git diff-tree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39171874/

    相关文章:

    Git Directory Diff 在我的子模块中不起作用

    git - "git diff"、 "git diff HEAD"和 "git diff --staged"的奇怪输出?

    git:所有更改文件的列表,包括子模块中的文件

    带有交错线的 git diff

    没有经验的成员的 Git 工作流程

    git - 是否可以在 gitk 中配置差异?

    混帐克隆 : fatal: gnutls_handshake() failed

    git - 如何在 macOs 上的 sourcetree 中更改 github 帐户的用户名密码?

    git - pull-only repo 的 'git status' 表示该分支位于 origin/master 之前。为什么?

    linux - 如何在gerrit中创建 merge 补丁和 merge 补丁之前的依赖关系?