在 Git 存储库中查找早于特定日期的文件

ele*_*tro 4 git

我正在尝试查找早于过去特定日期的文件,例如,在 Git 存储库中 2 个月未修改的 cpp 源文件。

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

我怎样才能做到这一点?

Sco*_*don 5

首先,我们需要找到当前在 repo 中的文件。这很容易:

git ls-files
Run Code Online (Sandbox Code Playgroud)

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

git log --since "<some date>" -- somefile.cpp
Run Code Online (Sandbox Code Playgroud)

(如果自给定日期以来文件没有被修改,这将不会给出任何输出。)

将所有这些与另一个git log用于用户友好输出的命令放在一起,这是一个应该完成这项工作的脚本:

git ls-files
Run Code Online (Sandbox Code Playgroud)

用法:

/path/to/myscript.sh "2017-01-01 12:00"
Run Code Online (Sandbox Code Playgroud)

这将仅显示自 2017 年 1 月 1 日中午之前尚未修改的文件。

它是 Bash,所以你当然可以将其压缩为一行:

git log --since "<some date>" -- somefile.cpp
Run Code Online (Sandbox Code Playgroud)

要将结果限制为某些类型的文件,请grep在中间添加一个命令,如下所示:

git ls-files | grep -e ".cpp$" -e ".h$" -e ".c$" | while read path; ...
Run Code Online (Sandbox Code Playgroud)

这是上述脚本的一个版本,可让您将这些文件类型作为参数传递:

#!/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
Run Code Online (Sandbox Code Playgroud)

用法:

/path/to/myscript.sh "2017-01-01 12:00" ".cpp$" ".h$" ".c$"
Run Code Online (Sandbox Code Playgroud)