我有一个来自 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/