运行 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
将其缩小到仅几个提交
考虑 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