git - 检索 Git 中特定提交中的文件路径

标签 git github logging show filepath

我有一个来自 git 存储库的提交 ID 和文件名列表。我需要的是根据提交 ID 获取列表中每个文件的文件路径。但我不知道如何使用 git 命令来做到这一点。

假设我有一个提交 ID 和文件名:[cb85815bc1, GuiCommonElements.java]。 现在我需要该提交 ID 中文件的完整路径。因此,输出应该类似于 path/path/path/GuiCommonElements.java

我尝试了很多命令,但没有给出这样的结果。

git show cb85815bc1 --grep='GuiCommonElements.java'
git log cb85815bc1 --grep='GuiCommonElements.java' --name-only

如有任何帮助,我们将不胜感激。

最佳答案

git show (或 git log -p ,它执行非常相似的操作,但对多个提交进行操作)将区分与其父级的提交。添加--name-only减少 diff 输出以仅显示更改的文件名,而不是更改的文件名加上指令集。

您可能想要使用 git ls-tree ,它显示提交中包含的文件的名称。如果您不在存储库的顶层,git ls-tree默认情况下仅显示当前目录中的内容,因此您可能需要添加 -r --full-tree 。然后,您想要查找包含或以您选择的名称结尾的内容:

git ls-tree -r --full-tree cb85815bc1 | grep GuiCommonElements.java

这有一点缺陷,如 grep它本身接受正则表达式参数并显示匹配的行,因此它不仅会显示如下文件:

lib/old/GuiCommonElements.java
lib/new/GuiCommonElements.java

而且:

other/ThisIsNotGuiCommonElements.java

(因为包含 GuiCommonElements.java )并且:

other/GuiCommonElementsXJava

(因为 . 匹配任何字符之一,包括 X )。但这可能已经足够好了,如果您愿意,可以稍微加强一下。

git ls-tree documentation声称需要 <path>...参数是“要匹配的模式”,但 glob 模式似乎在这里不起作用:如果 glob 有效,'**/GuiCommonElements.java'可以解决这个问题,但在我刚才的测试中却没有。

关于git - 检索 Git 中特定提交中的文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56248186/

相关文章:

javascript - BIRT 记录数据集的 onFetch 步骤

git - 'git add --patch' 来包含新文件?

github - 在 README.md 中引用显示的图像

git - 用户拥有的项目和存储库项目板有什么区别

asp.net-core - 使用 Blazor WebAssembly 设置日志记录

logging - Fluentd 复制输出插件未将相同的数据发送到两个目的地?

Git 没有根据 .ssh/config 选择正确的 key

gitlab不创建 repo

git - SSH代理转发已配置并且(似乎可以)运行,但是github仍然要求输入用户名和密码

java - Gradle/Jenkins JAR发布到GitHub