我希望能够检索远程仓库中子目录的最新修订哈希。我可以使用以下命令(已纠正)在本地回购中获取子目录的修订哈希:
git rev-parse HEAD:path/to/subdir
(请参阅How to retrieve the hash for the current commit in Git?)
我可以使用以下命令获取远程仓库的HEAD的修订哈希:
git ls-remote ssh://git@myserver.com/repo-name.git HEAD
(请参阅Getting the last commit hash from a remote repo without cloning)
但是我还没有找到一种将两者结合的方法,即在不获取代码的情况下从远程仓库获取子目录哈希。有可能吗?
编辑说明:
我正在寻找一个完全不需要本地存储库即可运行的命令,就像我们可以执行git ls-remote
而无需本地存储库副本一样。
ALSO:编辑了复制粘贴错误的第一个示例。 (感谢@torek指出错误。)
对于上下文,我想编写一个脚本来检查是否已对特定子目录进行了更改。命令git rev-parse
给出了我正在寻找的确切信息,但是必须在本地存储库上运行。
答案 0 :(得分:2)
我正在寻找一个完全不需要本地存储库即可运行的命令,就像我们可以执行git ls-remote而无需本地存储库副本一样。
您必须在远程计算机上运行命令 ,即在其中具有外壳程序访问权限,或者在其中内部有人可以为您提供后门方式来运行该命令。例如,如果遥控器是host2.example.com
,则可以执行以下操作:
ssh host2.example.com 'git -C /path/to/repo rev-parse ...'
这当然要求您能够登录到该主机。如果您无法登录到该主机,则否,则需要首先克隆存储库。
同时,返回到rev-parse
命令。就您而言,这似乎足够了,但总的来说:
git rev-parse HEAD:path/to/subdir
与Latest commit hash of subdirectory中显示的命令有很大的不同(这在某些时候是链接的,所以现在是通过此答案):
git log -n 1 --format="%h %aN %s %ad" -- $directory
git rev-parse HEAD:path/to/subdir
打印的是内部Git tree 对象的哈希ID,该对象在 current 提交中存储path/to/subdir
。但是git log -n 1 ... $directory
打印的是某次提交的哈希ID。这绝不是任何Git内部树对象的哈希ID。
此git log
找到的提交是第一个满足某些约束的提交,在通过枚举git log
通常执行的提交而形成的提交序列中,每次提交都从{{ 1}},然后向后工作。有问题的约束条件是,通过比较(与HEAD
一样),在该对中,将一些非合并提交的(单个) parent 提交与提交本身进行了比较提交,git diff
中的某些文件已更改。
也就是说,假设我们有以下部分提交图:
path/to/subdir
其中...--F--G--H <-- master (HEAD)
是一些提交哈希ID,H
是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
-vs-G
),然后继续查看H
(并比较G
-vs-F
),命令:
G
将打印提交git log -n 1 --format="%h %aN %s %ad" -- $directory
的缩写哈希(%h
),即提交G
的作者姓名(应用.mailmap
,%aN
之后),来自提交G
的主题行(%s
)和来自提交G的作者日期(G
)。
但正在运行:
%ad
打印提交git rev-parse HEAD:path/to/subdir
中 tree 对象的完整哈希ID,该ID包含有关提交{{1}的快照所必需的任何子树和Blob的信息}}。
如果要枚举(可能有多个)提交哈希ID,无论是否应用各种约束,都可以使用H
或H
来遵循提交图。毕竟,这就是git log
命令的作用:遍历提交图,从您请求的起点开始(或者如果您不要求任何特定起点,则从git rev-list
开始)并显示提交
如果您想要一个特定的提交哈希ID,并且知道足够的关于该提交的 ,则可以使用git log
。在某些情况下,HEAD
可以也遍历提交图:特别是它可以找到其 commit log message 包含某些字符串或正则表达式的提交。但是,检查一个提交的父级与该提交之间的差异并不足够聪明。为此,您需要git rev-parse
或其管道姐妹命令git rev-parse
。
(还要注意,默认情况下,git log
忽略任何合并提交的差异。这是因为存在两个或多个父快照的事实使合并的差异变得复杂:进行差异时,Git应该使用哪个父母?为避免回答该问题,git rev-list
根本不打扰,默认情况下。)