我有一个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
任何帮助将不胜感激。
答案 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>...
就可以解决问题,但是在我的测试中他们没有。