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

5

我几乎使用了所有的git log命令,但是我还没有找到最好的方法来做这件事。我只需要获取文件名和路径,不需要其他信息。

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

我需要在git log命令中输入日期FROM和TO。但是,git log会给出开发者名称、日期、提交编号或其他我不想要的信息,但我只想要文件名和完整路径,应该如何获取?

3个回答

11

使用--name-only选项,并移除空格式的消息。

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

按照惯例使用所有其他git log选项。例如:

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

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

可选择排序并去重

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

我突出了“仅文件名与路径”这个短语。 - Murali Uppangala

4
使用--since--until选项来选择时间范围,然后可以使用UNIX管道来进行grepsort和收集uniq路径:
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输出内容请参见如何使git log显示类似svn log -v的文件名
如果你有两个提交哈希值,你也可以像其他答案中提到的那样使用git diff--name-only
git diff hash1..hash2 --name-only

我按照你上面展示的方式进行了操作,简化成了 "git log --pretty=format: --name-status"。是的,这只会给出文件名,但它会在每行文件名前添加修改状态 A、M、D 等。这就是为什么我强调了“仅带路径的文件名”!!有什么解决方法吗? - Murali Uppangala
1
@flute 明白了!你只需要在末尾加上一些 sed 魔法(请参见编辑):... | sed -e 's/^\w\t*\ *//' - Ionică Bizău
你是不是魔术师啊?你用'sed'诱导git log这么做了!它有效! - Murali Uppangala
我有一个Python要处理!这些魔法在它上面不起作用。cmd = ["git", "log --name-status | grep -E '^[A-Z]\b' | sort | uniq | sed -e 's/^\w\t\ //'"] subprocess.call(cmd)。在Python脚本中,这会导致错误-说“命令无效或其他原因”。可能是因为我使用的是Windows机器。 - Murali Uppangala
@flute 如果它在代码外运行正常,那么它也应该在你的代码中正常工作,但请确保 git 可以作为可执行文件访问。 - Ionică Bizău
显示剩余3条评论

2

这个方法不使用 git log但是如果你愿意使用提交对象(哈希值、分支引用或其他提交标识符),git diff 可以很简单地实现。以下是获取最近三次提交的更改文件示例。

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

您可以用单个commitish替换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 选项。查看 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接