在Git存储库中查找早于某些日期的文件

时间:2017-02-03 19:53:44

标签: git

我正在尝试查找过去某些日期之前的文件,例如,在Git仓库中未修改2个月的cpp源文件。

如果我使用Linux find shell命令,我将无法找到它,因为我的工作区中的文件标有“git sync”-ed的日期。

我该怎么做?

1 个答案:

答案 0 :(得分:4)

首先我们需要找到目前在repo中的文件。这很简单:

git ls-files

对于这些文件中的每一个,我们希望查看它是否在给定日期之后被修改。 git log可以在这里工作:

git log --since "<some date>" -- somefile.cpp

(如果自给定日期以来文件未被修改,则不会输出。)

将所有内容与另一个git log命令放在一起,以实现用户友好的输出,这里有一个应该完成工作的脚本:

#!/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$"