繁体   English   中英

我怎样才能在 git 中获取文件的每次提交的代码行

[英]How can i get the line of code per commit for a file in git

我尝试在 git 中使用以下语句:

$ wc -l file name 

以上声明只给了我最新版本。 但是我需要每次提交,那么我怎么才能得到它呢?

您发布的命令与git没有任何共同之处。 wc是一个通用的 Unix 工具,用于计算文件中的字节、字符、单词或行word count (它的名字代表word count )。 它不能用于计算代码行数,它是否与语言无关并且无法从注释中分辨出一行代码。

但是,如果您需要文件中的总行数,则可以使用以下命令:

git log --numstat --format=oneline -- file.txt | grep file.txt$

获取指定文件的更改历史记录。

输出包含由可变数量的空格分隔的三列。 第一列包含每次提交添加的行数,第二列包含该提交删除的行数,第三列始终是项目内文件的路径。

像往常一样,提交以相反的顺序显示; 第一行是最近修改文件的提交,最后一行是文件创建时的提交(第二列应该包含0 )。

编写一个简单的脚本(使用您首选的脚本语言)来解析输出并在每次提交时生成文件的行数很容易。

更新

上面的命令行不保留提交哈希。 仅运行其中的git log部分会为每次提交生成两行。 第一行包含提交哈希和提交消息的第一行,用空格分隔。 第二行是上面解释的那一行。 对于一个小的解析脚本来说仍然是一件容易的事。

bash ,解析脚本可能如下所示:

#!/bin/bash

if [ ! -f $1 ]; then echo Cannot find the file \"$1\".; exit 1; fi

LINES=$(wc -l $1 | sed 's/^ *\([0-9]*\) .*$/\1/')
git log --numstat --format=oneline -- $1 | while read -r HASH COMMENT; do
  read -r INSERTED DELETED FILENAME
  echo $HASH $LINES
  LINES=$(($LINES-$INSERTED+$DELETED))
done

它接受文件路径作为它的第一个参数并生成一个行列表; 每行包含提交哈希和输入文件在提交后的行数。

您可以使用git log获取给定$filename所有提交哈希,并在您的 shell 中使用for循环检查这些。 例如(在 Zsh 中):

git stash
for sha in $(git log --format=format:%H -- $filename); do
    git checkout $sha -- $filename
    echo "$(wc -l $filename) @ $sha" 
done
git stash pop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM