如果你不能获取克隆和遥控器之间的Git差异?

时间:2015-08-25 22:33:10

标签: git

我有一个场景,我将我的存储库克隆定期创建为只读目录存档目的。

我有一些上下文需要在克隆目录中运行的脚本,我试图找到一些方法来检查是否存在某个文件的新版本而不是克隆目录中的文件。

我是一个相对较新的git用户,但我认为这样做的每一种方式似乎都基于这样的想法:至少能够进行获取以获取克隆以来的提交历史记录。我不能这样做,因为克隆目录是只读的。

来自其他CM系统我一直认为必须有一些方法让我从远程获取该文件的最新版本的ID,并将其与不依赖于首先获取但没有成功的克隆进行比较。

我已经提到this帖子,但唯一的答案似乎是没有替代提取。

1 个答案:

答案 0 :(得分:0)

您无法直接获得实际差异。

可以查看您是否是最新的,如果没有,请使用具有较新内容的系统 - 根据定义,该系统是< em> not 只读 - 提供差异,因为旧版本必须 1 在较新版本的历史记录中。

要获得较新版本与旧版本的完全差异,请在较新的系统上运行此命令:

$ git diff <old-commit-sha1> <new-commit-sha1>

将此差异限制为单个路径(从而检查该路径是否需要更新):

$ git diff <old-sha1> <new-sha1> -- <path>

如果非只读系统不允许您运行足够的命令来生成所需的差异,则需要第三个位置(系统或git存储库),您可以通过克隆生成此差异更高级的存储库,使用克隆(具有所需的一切)进行差异,然后可选地删除此克隆。如果你可以保留这个克隆并保持读/写,那么你将能够更好地完成同一任务的 next 运行。此外,您会发现您可以完全丢弃只读克隆,因为此时您只是将它用于一件事:您正在使用它来保留先前提交的SHA-1。

您需要的只是旧提交的SHA-1 ID,因为较新的系统具有完整的历史记录(但请再次参见脚注1)。此外,这是标签的用途:标签指的是特定的提交, 2 给出一个人类可读的名称,否则只是一个丑陋的SHA-1。 (好吧,带注释的标签为您提供的不仅仅是一个名称。特别是它们让您提供一个PGP签名,表示您也支持该特定的SHA-1。)

好的,但你怎么知道你是否是最新的?

要执行此操作,您必须至少具有某些对读/写存储库的访问权限。然后,您只需要查看SHA-1与其中一个分支相比,与SHA-1与其中一个分支相比(无论它是否具有相同的名称)。

有人类可读的版本git show remote <remote-name>,它会向您显示以下内容:

$ git show remote origin
... [snip]
    master             pushes to master             (local out of date)

以及需要更多脚本才能找到实际的SHA-1:

$ git ls-remote origin

第二个产生了很多细节,默认情况下会给你一切;添加--heads--tags和/或特定参考只能获得一个项目;例如:

$ git ls-remote origin refs/heads/master
 <big ugly sha-1>   refs/heads/master

将此SHA-1与您自己的SHA-1进行比较,以获得相同的分支:

$ git rev-parse master
<big ugly sha-1>

如果这些不同,则非读取存储库中会有新的提交。请注意,这些新提交可能不会影响您关注的某些特定&lt;路径&gt;要找出答案,您必须使用具有这些提交的存储库,以便您可以在您关注的两个提交中找到路径的SHA-1。

例如:

$ git rev-parse master:.gitignore
50ac108339a8c7164e0620a074049ad03cb80aee

您可以针对特定修订执行此操作:

$ git rev-parse <sha-1>:.gitignore

但你必须有提交。

1 这假设控制读/写存储库的人不会改变或删除其中的一些。当您将数据控制权交给其他人时,您当然会做出这样的假设。如果你已经记住了一个特定的SHA-1,那么它是一个加密签名的事实意味着你可以测试它们是否已经改变了你的数据,但它本身还不足以恢复它:你需要一些其他的克隆( s)为此。

2 标签可以直接引用树或blob,或引用另一个标签,而不是提交,但这不是通常的情况。