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

时间:2019-05-22 01:28:43

标签: 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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

e = items.find().text.strip() (或git show,其作用非常相似,但可在多个commit上运行)会相对于其父parent diff 。添加git log -p会使diff输出仅显示已更改的文件名,而不显示已更改的文件名以及指令集。

您可能想在这里使用--name-only,它显示提交中包含的文件名。如果您不在存储库的顶层,则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 与任何字符之一匹配,包括.)。但这可能已经足够好了,而且如果您愿意的话,可以将其支撑起来。

git ls-tree documentation声称它接受X个参数为“匹配模式”,但是全局模式似乎在这里不起作用:如果全局有效,<path>...就可以解决问题,但是在我的测试中他们没有。