我正在尝试查找过去某些日期之前的文件,例如,在Git仓库中未修改2个月的cpp源文件。
如果我使用Linux find
shell命令,我将无法找到它,因为我的工作区中的文件标有“git sync”-ed的日期。
我该怎么做?
答案 0 :(得分:4)
首先我们需要找到目前在repo中的文件。这很简单:
git ls-files
对于这些文件中的每一个,我们希望查看它是否在给定日期之后被修改。 git log
可以在这里工作:
git log --since "<some date>" -- somefile.cpp
(如果自给定日期以来文件未被修改,则不会输出。)
将所有内容与另一个git log
命令放在一起,以实现用户友好的输出,这里有一个应该完成工作的bash脚本:
#!/bin/bash
date=$1
git ls-files | while read path
do
if [ "$(git log --since \"$date\" -- $path)" == "" ]
then
echo "$path $(git log -1 --pretty='%h %ad' -- $path)"
fi
done
用法:
/path/to/myscript.sh "2017-01-01 12:00"
这将仅显示自2017年1月1日中午之前尚未修改的文件。
这是Bash,所以当然你可以把它压缩到一行:
git ls-files | while read path; do if [ "$(git log --since \"$1\" -- $path)" == "" ]; then echo "$path $(git log -1 --pretty='%h %ad' -- $path)"; fi done
要将结果限制为某些类型的文件,请在中间添加grep
命令,如下所示:
git ls-files | grep -e ".cpp$" -e ".h$" -e ".c$" | while read path; ...
以上是上述脚本的一个版本,允许您将这些文件类型作为参数传递:
#!/bin/bash
date=$1
grepargs=""
shift
while [ $? -eq 0 ]
do
grepargs="$grepargs -e \"$1\""
shift
done
git ls-files | grep $grepargs | while read path
do
if [ "$(git log --since \"$date\" -- $path)" == "" ]
then
echo "$path $(git log -1 --pretty='%h %ad' -- $path)"
fi
done
用法:
/path/to/myscript.sh "2017-01-01 12:00" ".cpp$" ".h$" ".c$"