如何找到远程git子目录的最新修订哈希?

时间:2019-04-01 14:49:06

标签: git

我希望能够检索远程仓库中子目录的最新修订哈希。我可以使用以下命令(已纠正)在本地回购中获取子目录的修订哈希:

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给出了我正在寻找的确切信息,但是必须在本地存储库上运行。

1 个答案:

答案 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,HG的父级,而HF的父级。 (请注意,此图片段中没有合并提交。)

进一步假设,如果我们将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,无论是否应用各种约束,都可以使用HH来遵循提交图。毕竟,这就是git log命令的作用:遍历提交图,从您请求的起点开始(或者如果您不要求任何特定起点,则从git rev-list开始)并显示提交

如果您想要一个特定的提交哈希ID,并且知道足够的关于该提交的 ,则可以使用git log。在某些情况下,HEAD可以遍历提交图:特别是它可以找到其 commit log message 包含某些字符串或正则表达式的提交。但是,检查一个提交的父级与该提交之间的差异并不足够聪明。为此,您需要git rev-parse或其管道姐妹命令git rev-parse

(还要注意,默认情况下,git log 忽略任何合并提交的差异。这是因为存在两个或多个父快照的事实使合并的差异变得复杂:进行差异时,Git应该使用哪个父母?为避免回答该问题,git rev-list根本不打扰,默认情况下。)