如何使用 git 日志仅获取带路径的文件名?

How to get ONLY filename with path using git log?

我几乎使用了所有 git 日志命令,但我还没有找到执行此操作的最佳方法。我只需要这个 - 仅获取带有路径的文件名

/path/filename.txt
/path/anotherfile.ext
...
...

我的输入是 git 日志命令的日期 FROM 和 TO。 git 日志提供开发人员名称或日期或提交编号或我不想要的文件名。如何只获取完整路径的文件名?

使用 --since--until 选项 select 时间范围,然后您可以使用 UNIX 管道 grepsort 并收集uniqe 个路径:

git log --name-status --since='..' --until='..' | grep -E '^[A-Z]\b' | sort | uniq | sed -e 's/^\w\t*\ *//'

示例:

git log --name-status --since='1 January 2015' --until='2 January 2015' | grep -E '^[A-Z]\b' | sort | uniq | sed -e 's/^\w\t*\ *//'

有关更详细的 git log 输出,请参阅 How to have git log show filenames like svn log -v


如果你有两个提交哈希,你也可以使用 git diff--name-only 代替,正如另一个答案提到的:

git diff hash1..hash2 --name-only

这不使用 git log,但如果 您愿意使用提交对象(散列、分支引用或其他提交标识符),git diff 让它变得简单。获取最后三个提交的更改文件的示例。

$ git diff HEAD~3 --name-only
> some/path/with/file.php
> another/path/and/file.html
> yet/another.json

您可以将 HEAD~3 替换为单个提交,以便与当前 HEAD(您是 "on" 的提交)进行比较,或者然后使用 [=16 定义提交范围=]:

$ git diff HEAD..abcd1234 --name-only
> file/name/here.cpp

$ git diff 1234abcd..abcd1234 --name-only
> some/file/name-here.txt

如果您需要根据修改类型(例如添加、修改、删除...)过滤文件,您可以使用--diff-filter选项。 man git diff:

--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
       Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have their type (i.e. regular file, symlink, submodule, ...) changed (T), are
       Unmerged (U), are Unknown (X), or have had their pairing Broken (B). Any combination of the filter characters (including none) can be used. When * (All-or-none) is added
       to the combination, all paths are selected if there is any file that matches other criteria in the comparison; if there is no file that matches other criteria, nothing
       is selected.

如果您需要使用日期进行过滤,那么这可能不是最佳选择。也许使用 git log --since=... 获取日期的第一个哈希并将其传递给 git diff?

使用--name-only并删除格式为空的消息

git log --name-only --format=""

只需像往常一样使用所有其他 git log 选项。例如。

git log --name-only --format="" -n 2 master

可选择排序和删除重复项

git log --name-only --format="" | sort | uniq