【发布时间】:2023-04-04 06:13:02
【问题描述】:
我几乎使用了所有 git log 命令,但我还没有找到最好的方法来做到这一点。我只需要这个 - 只获取带有路径的文件名
/path/filename.txt
/path/anotherfile.ext
...
...
我的输入是 git log 命令的日期 FROM 和 TO。 git log 提供开发人员名称或日期或提交编号或我不想要的文件名。如何仅获取具有完整路径的文件名?
【问题讨论】:
我几乎使用了所有 git log 命令,但我还没有找到最好的方法来做到这一点。我只需要这个 - 只获取带有路径的文件名
/path/filename.txt
/path/anotherfile.ext
...
...
我的输入是 git log 命令的日期 FROM 和 TO。 git log 提供开发人员名称或日期或提交编号或我不想要的文件名。如何仅获取具有完整路径的文件名?
【问题讨论】:
使用--name-only 并删除格式为空的消息
git log --name-only --format=""
像往常一样使用所有其他git log 选项。例如。
git log --name-only --format="" -n 2 master
可选择排序和删除重复项
git log --name-only --format="" | sort | uniq
【讨论】:
使用--since 和--until 选项选择时间范围,然后您可以使用UNIX 管道到grep、sort 并收集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
【讨论】:
sed 魔法(见编辑):... | sed -e 's/^\w\t*\ *//'
这不使用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(您“打开”的提交)进行比较,或者然后使用 <commitish>..<commitish> 定义提交范围:
$ 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?
【讨论】: