【问题标题】:Run shell command against every version of the same file in git对 git 中同一文件的每个版本运行 shell 命令
【发布时间】:2023-12-17 13:03:01
【问题描述】:

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

版本是指文件的唯一快照(即文件更改时)。更具体地说,例如,最后一个 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 shell zsh


    【解决方案1】:

    我会这样做

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

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

    这会一直追溯到过去,但您可以使用 head 将其缩小到几个提交

    【讨论】:

    • 好方法,但作为 shell 脚本最佳实践说明:mywiki.wooledge.org/DontReadLinesWithFor
    • 请考虑:while read -r i; do ...; done &lt; &lt;(git log --pretty=%h -- my_file)
    • 好多了。谢谢!
    【解决方案2】:

    您可以循环提交:

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

    【讨论】:

      最近更新 更多