使用git log时如何排除目录?

时间:2015-11-17 11:59:12

标签: git awk

目标

我想知道一段时间内特定存储库中更改的行数,并将其打印到一个简单的文本文件中。但是,当我运行下面的代码时,我收到一个错误,我不确定如何解决。

代码

$val

错误

git log --stat --since="2015-01-01" --until="2015-11-16" `find . \( ! -path "*[PATH]*" -a ! -path "*[PATH2]*" \)` | awk -F',' "/files? changed/ {
    files += \$1
    insertions += \$2
    deletions += \$3
    destination = \"$DESTINATION\"}

END {
    print \"Files Changed: \" files > destination
    print \"Insertions: \" insertions > destination
    print \"Deletions: \" deletions > destination
    print \"Lines changed: \" insertions + deletions > destination}"

其他有用信息

  • 使用的Git版本是1.7.1。所以我不能用这个:--oneline --format =%s - 。 “:(排除)[路径]”
  • 我知道当我不尝试排除目录时,此代码有效。
  • 我也知道“find”在单独运行时可以正常工作。

问题

有人可以帮我理解我做错了什么或者提供了一个更好的方法来排除多个目录吗?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

git 编写的错误消息说明了如何修复错误。问题是,有时, git 无法判断它的第一个参数是路径还是修订版。 --可用于消除参数的歧义。

除此之外,您的代码中还存在一些其他小问题。 shell也理解简单的引号,其中变量不会被扩展。你绝对应该用简单的引号编写 awk 脚本,因为它可以防止笨拙的转义序列垃圾代码。

git log --stat --since='2015-01-01' --until='2015-11-16' $(find . \( ! -path '*[PATH]*' -a ! -path '*[PATH2]*' \)) | awk -F',' '
/files? changed/ {
  files += $1
  insertions += $2
  deletions += $3
}

END {
  print "Files Changed: " files
  print "Insertions: " insertions
  print "Deletions: " deletions
  print "Lines changed: " insertions + deletions
}' > "${DESTINATION}"

此外,如果您只将输出写入一个文件,则更容易让 awk 将其报告写入 stdout 并将其重定向到您想要的文件,而不是而不是在 awk 本身进行输出重定向。