我希望能够在远程存储库中检索子目录的最新修订版哈希。我可以使用以下命令(更正)获取本地存储库上子目录的修订哈希:
git rev-parse HEAD:path/to/subdir
(请参阅如何在 Git 中检索当前提交的哈希?
我可以使用以下命令获取远程存储库的 HEAD 的修订哈希:
git ls-remote ssh://git@myserver.com/repo-name.git HEAD
(请参阅在不克隆的情况下从远程存储库获取最后一个提交哈希)
但是我还没有找到将两者结合起来的方法,即在不检索代码的情况下从远程存储库获取子目录哈希。这可能吗?
编辑澄清:
我正在寻找一个可以在没有本地存储库的情况下运行的命令,就像我们可以在没有本地存储库副本的情况下执行git ls-remote
一样。
另外:编辑了复制粘贴错误的第一个示例。(感谢@torek指出错误。
对于上下文,我想编写一个脚本,可以检查是否已对特定子目录进行更改。该命令git rev-parse
提供我正在寻找的确切信息,但它必须在本地存储库上运行。
我正在寻找一个可以在没有本地存储库的情况下运行的命令,就像我们可以在没有本地存储库副本的情况下执行 git ls-remote 一样。
您必须在远程上运行一个命令 - 即,在那里有shell访问权限,或者在那里有人给你一个后门的方式来运行命令。 例如,如果遥控器host2.example.com
,您可以执行以下操作:
ssh host2.example.com 'git -C /path/to/repo rev-parse ...'
当然,这要求您能够登录到该主机。 如果您无法登录到该主机,则不可以,您需要先克隆存储库。
同时,回到rev-parse
命令。 在您的情况下,这似乎已经足够了,但总的来说:
git rev-parse HEAD:path/to/subdir
与子目录的最新提交哈希中显示的命令非常不同(这是在某个时候链接的,所以现在通过这个答案):
git log -n 1 --format="%h %aN %s %ad" -- $directory
git rev-parse HEAD:path/to/subdir
打印的是内部 Git树对象的哈希 ID,该对象在当前提交中存储path/to/subdir
。 但是git log -n 1 ... $directory
打印的是某些提交的哈希 ID。 这绝不是任何 Git 内部树对象的哈希 ID。
此git log
找到的提交是满足某些约束的第一个提交,在通过按git log
通常的方式枚举提交形成的提交序列中,一次一个从HEAD
开始并向后工作。 有问题的约束是,通过将某些非合并提交的(与git diff
一样)的(单个)父提交与提交本身进行比较,在该对提交中,path/to/subdir
中的某些文件发生了变化。
也就是说,假设我们有以下部分提交图:
...--F--G--H <-- master (HEAD)
其中H
是某个提交哈希ID,G
是H
的父级,F
是G
的父级。 (请注意,此图形片段中没有合并提交。
进一步假设,如果我们比较G
中的快照与H
中的快照,唯一更改的文件是README.md
.因此,git log -p
表明,在H
年我们改变了README.md
。 但是,在比较F
中的快照与G
中的快照时,文件path/to/subdir/foo.cc
已更改。 所以git log -p
会表明,在G
中,我们在path/to/subdir
内更改了一个文件。
由于git log
首先查看H
(从而比较G
-vs-H
),但随后继续查看G
(从而比较F
-vs-G
),命令:
git log -n 1 --format="%h %aN %s %ad" -- $directory
将打印提交G
的缩写哈希(%h
),提交G
的作者姓名(应用.mailmap
后,%aN
),提交G
的主题行(%s
),以及提交G的作者日期(%ad
)。
但是运行:
git rev-parse HEAD:path/to/subdir
打印提交H
中树对象的完整哈希 ID,其中包含有关作为提交H
一部分的快照所需的任何子树和 blob 的信息。
如果要枚举(可能很多)提交哈希 ID,无论是否应用各种约束,请使用git log
或git rev-list
来跟踪提交图。 毕竟,这就是git log
命令的作用:遍历提交图,从您请求的起点开始(如果您不请求任何特定的起点,则从HEAD
开始)并显示提交。
如果您想要一个特定的提交哈希 ID,并且您对该提交有足够的了解,则可以使用git rev-parse
. 在某些情况下,git rev-parse
还可以遍历提交图:特别是它可以查找其提交日志消息包含某些字符串或正则表达式的提交。 但是检查从一个提交的父级到该提交的差异还不够聪明;为此,您需要git log
或其管道姐妹命令,git rev-list
.
(另请注意,默认情况下,git log
忽略任何合并提交的差异。 这是因为合并的差异由于有两个或多个父快照而变得复杂:Git 在进行差异时应该使用哪个父快照? 为了避免回答这个问题,默认情况下,git log
根本不费心做差异。