Git显示文件名和更改次数

时间:2016-01-11 19:33:03

标签: git

我正在尝试从提交中获取每个文件的文件名和更改次数。

理想情况下,我会输出如下:

file1.txt +10 -20
file2.txt +239 -15

到目前为止,我有: git show --pretty="format:" --name-only

但这只能获取文件名。

2 个答案:

答案 0 :(得分:3)

您可以通过获取带有numstat标志的格式,然后通过awk传递它们来反转它们来实现该结果。

git show COMMIT_ID --pretty="format:" --numstat | awk '{name=$3; insertions=$1; deletions=-$2; print name, insertions, deletions}'

答案 1 :(得分:1)

git diff会显示已删除或已添加的内衬数量 使用awk,sed或任何其他unix命令从输入中提取数据

--shortstat就是你想要的:

git diff --shortstat commit1 commit2

git cat-file -s将输出git中对象的大小(以字节为单位) git diff-tree可以告诉你一棵树和另一棵树之间的差异。

将它们放在一个名为git-file-size-diff的脚本中。

我们可以尝试以下内容:

#!/bin/sh

args=$(git rev-parse --sq "$@")

# the diff-tree will output line like:
# :040000 040000 4...acd0 fd...94 M main.webapp

# parse the parameters form the diff-tree
eval "git diff-tree -r $args" | {
  total=0

  # read all the above params as described in thi sline:
  # :040000 040000 4...acd0 fd...94 M   main.webapp
  while read A B C D M P
  do
    case $M in
      # modified file
      M) bytes=$(( $(git cat-file -s $D) - $(git cat-file -s $C) )) ;;

      # Added file
      A) bytes=$(git cat-file -s $D) ;;

      # deleted file
      D) bytes=-$(git cat-file -s $C) ;;
      *)

      # Error - no file status found
      echo >&2 warning: unhandled mode $M in \"$A $B $C $D $M $P\"
      continue
      ;;

    # close the case statment
    esac

    # sum the total bytes so far
    total=$(( $total + $bytes ))

    # print out the (bytes) & the name of the file ($P)
    printf '%d\t%s\n' $bytes "$P"
  done

  # print out the grand total
  echo total $total
}

在使用中,如下所示:

$ git file-size-diff HEAD~850..HEAD~845
-234   a.txt
112    folder/file.txt
-4     README.md
28     b.txt
total -98

通过使用git-rev-parse,它应该接受指定提交范围的所有常用方法。

注意
bash在子shell中运行while while,因此额外的花括号可以避免在子shell退出时丢失总数。