如何使用 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 管道 grep
、sort
并收集uniq
e 个路径:
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
我几乎使用了所有 git 日志命令,但我还没有找到执行此操作的最佳方法。我只需要这个 - 仅获取带有路径的文件名
/path/filename.txt
/path/anotherfile.ext
...
...
我的输入是 git 日志命令的日期 FROM 和 TO。 git 日志提供开发人员名称或日期或提交编号或我不想要的文件名。如何只获取完整路径的文件名?
使用 --since
和 --until
选项 select 时间范围,然后您可以使用 UNIX 管道 grep
、sort
并收集uniq
e 个路径:
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