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

3

目的

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

代码

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}"

错误信息

fatal: ambiguous argument '[PATH]': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
awk: cmd. line:7: fatal: expression for `>' redirection has null string value

其他有用信息

  • 使用的Git版本为1.7.1。因此,我无法使用这个:--oneline --format=%s -- . ":(exclude)[PATH]"
  • 我知道当我不尝试排除目录时,这个代码可以正常工作。
  • 我也知道单独运行“查找”时它可以正确工作。

问题

请问有人能帮助我理解我做错了什么或提供更好的排除多个目录的方法吗?

非常感谢任何帮助。


只是一个想法:find 返回的文件中是否有任何空格(路径或文件名)?因为在这种情况下,反引号 find 会出错。 - Jeff Y
不好意思,Jeff,这个想法不行。我刚刚检查过它们了。 - Paul Brindle
还有其他人有什么想法吗? - Paul Brindle
1个回答

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 中进行输出重定向。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接