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

Posted

技术标签:

【中文标题】如何使用 git log 仅获取带有路径的文件名?【英文标题】:How to get ONLY filename with path using git log? 【发布时间】:2016-01-09 21:54:12 【问题描述】:

我几乎使用了所有 git log 命令,但我还没有找到最好的方法来做到这一点。我只需要这个 - 只获取带有路径的文件名

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

可选择排序和删除重复项

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

【讨论】:

我突出显示了“ONLY file-name with path”这个短语。【参考方案2】:

使用--since--until 选项选择时间范围,然后您可以使用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 --pretty=format: --name-status" 。是的,这仅给出文件名,但它会在文件名之前的每一行的开头添加修改状态 A、M、D 等。这就是为什么我只提到带有路径的文件名!任何解决方法..?? @flute 知道了!最后你只需要一些sed 魔法(见编辑):... | sed -e 's/^\w\t*\ *//' 你是魔术师吗?你“诱惑”了 git log 来做这件事!!它有效! @flute 是的,Node.js 和 UNIX 黑魔法师。 :D UNIX 管道很棒,不是吗?很高兴我能帮上忙! 我有一个 Python,可以使用!这些魔法对它不起作用。 cmd = ["git", "log --name-status | grep -E '^[AZ]\b' | sort | uniq | sed -e 's/^\w\t*\ *//'"] subprocess.call(cmd)。这在 python 脚本中给出错误 - 说“命令无效或其他东西”。可能是因为我用的是windows机器。【参考方案3】:

这不使用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

【讨论】:

以上是关于如何使用 git log 仅获取带有路径的文件名?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上打开带有正斜杠的路径?

如何运行 git log 以仅查看特定分支的更改?

如何从 Pandas DataFrame 中的路径获取基本文件名

如何使用带有文件路径的 NSArray 获取 NSDictionary?

带有重命名检测的 git show 文件(相当于 git log --follow)

如何使用 datePattern 在 log4net 中指定绝对文件路径?