运行 shell 针对 git 中同一文件的每个版本的命令

Run shell command against every version of the same file in git

考虑 git 存储库中的文件 my_file。我想 运行 shell 命令 (例如 wc -l $FILE_VERSION)针对此文件的每个最后 K 版本给定的分支(例如 master)。

版本是指文件的唯一快照(即文件更改时)。更具体地说,例如,最新的 K=4 版本:

master   <file_changed>       v4
master~1 <file_not_changed>   
master~2 <file_changed>       v3
master~3 <file_changed>       v2
master~4 <file_not_changed>   
master~5 <file_changed>       v1

如何使用 git 解决这个问题?

您可以遍历提交:

git log "$file" \
    | grep '^commit ' \
    | head -n 10 \
    | while read _c id ; do
          git checkout "$id"
          echo "$id"
          wc -l < "$file"
      done

我会这样做

for i in $(git log --pretty='%h' -- my_file)
do
   echo "$i $(git show ${i}:my_file | wc -l)"
done

这实际上并没有签出文件。简单地显示它。如果需要,您可以将其重定向到一个文件中,然后 运行 对其执行更复杂的命令。对于wc,这就足够了。它还使用 --pretty 参数来 git 记录,以便我们只获得我们需要的而不是整个提交信息。

这将一直返回,但您可以使用 head

将其缩小到仅几个提交