我想:
1)克隆回购
2)保存当前的回购ID(可能是文本文件?)
3)然后断开它与任何Git的连接,以便它不会随着时间而变化(关键步骤)
谢谢!
答案 0 :(得分:1)
我会逐步完成您的步骤列表;但我将主要从你的评论中开始工作:
我知道执行了哪个版本的代码非常重要。代码只会执行一次。
那是因为你的大部分问题似乎是试图想出一个满足这个要求的程序,但不幸的是它并不是基于对git的理解。
所以,
1)克隆回购
很好,这里没有问题。
2)保存当前的回购ID(可能是文本文件?)
A" repo ID"不是git已知的东西。根据您对您尝试做的事情的评论,我认为您的意思是您希望此时捕获回购消息的特定状态的标识符。在我看来,你想要的是你运行时将要检出的版本的提交ID。
你说你需要知道代码的运行版本,我认为这意味着你需要能够重现确切的源代码集。您实际上可以通过TREE
ID执行此操作。但COMMIT
ID意味着TREE
ID,并且还保留了提交元数据(作者信息,评论,项目历史记录中的位置) - 更重要的是,它是您最容易识别的ID查找并使用典型的面向用户的git命令语法。
这仍然没有抓住回购的整个状态,但理解 它如何停止对于我对你列表中第3项的说法非常重要。您从COMMIT
ID中获得的内容是存储库中refs的状态。
现在,至多其中一个参考资料有点重要,因为可能你已经检查了一个分支(我猜错master
),你运行的代码版本恰好是已确定的版本通过该分支的尖端提交。但是,一旦您获得了COMMIT
ID,那就是那个。分支机构可以继续前进,这并不重要。其他分支或标签可能指向(或可能指向未来)的地方当然无关紧要。这些事情都不会影响你运行它时的代码状态。
您可以通过运行COMMIT
来获取当前的git show
ID;或者如果您只想查看 COMMIT
ID,可以说git log -n1 --format='%H'
。如果您的工作树是干净的并且不包含未跟踪的文件,则这完全描述了代码的状态。 (如果你做有未提交的更改和/或未跟踪的文件,你需要单独捕获这些知识。最简单的事情,如果你需要知道工作树的确切状态,会如果你可以完全承诺工作树。)
3)然后断开它与任何Git的连接,以便它不会随着时间而变化(关键步骤)
首先,"断开它与任何Git"意思?你的意思是将它与github上的远程存储库断开连接吗?或者你的意思是你甚至不希望它在当地意识到它是一个git回购?
"断开"来自遥控器并不是很有意义。您可以将本地配置更改为"忘记"它来自哪个遥控器;但是,无论如何遥控器都会向你推动变化。
将代码从源代码管理中移除会对您始终能够识别和恢复此特定版本代码的目标产生反作用。 COMMIT
ID有意义,因为内容是git。
嗯,无论你的意思是什么,你都说"断开"从git是至关重要的,这样你就可以知道这个版本的代码没有改变。问题是,我在步骤2 中推荐的COMMIT
ID的含义无论如何都不会改变。该ID 总是正好代表该代码的版本,无论如何。
天生就是git并不是所有这些"连接"首先。几乎每个操作都在本地运行。作为一个配置问题,大多数人都有它"记住"上游回购所在的位置;但这只是为了方便,只有某些命令会导致与该远程存储库的通信。
如果您从未运行git fetch
(或git pull
,它会在后台进行取景),那么您将永远不会收到来自其他回购的更改。
即使您运行git fetch
,也不会更改任何本地参考号。您必须要求他们进行更改,方法是执行pull
合并来自远程的更改,或merge
合并任意更改,或rebase
或其他一些历史记录 - 重写操作,强制重定位ref,或在本地创建新提交。
即使你做了做了那些事情,它也永远不会改变你在步骤2中捕获的提交ID的含义。如果你改变了事情,那么包含你运行的代码的提交是"不可达"从回购中的所有refs,然后最终提交可能会丢失;所以不要这样做。不这样做的最简单方法是创建指向该提交的本地标记或分支。但即使在最糟糕的情况下,你渲染提交无法访问并且它从reflogs(默认情况下至少需要一个月)掉下来并且提交丢失给你...即使在这个完全可以避免的情况下,仍然捕获的COMMIT
ID永远不会引用任何其他版本的代码。
为什么?嗯,这是因为COMMIT
ID有160位与底层内容相关的信息,这种信息对我们来说可能是随机的。更改用于计算ID的任何内容,然后为了我们的目的而导致新的 - 基本上是随机的 - 从2 ^ 160的池中选择ID。符号2 ^ 160看似简洁;这个数字很大。 ID没有实际发生的可能性;当然不是在单一代码库的演变中(但实际上......从来没有)。
构成ID的方式,最终意味着如果您在工作树中的任何位置更改一个文件的一个字节并从中生成新的提交,您将获得一个新的不同ID。
因此,COMMIT
ID是验证您正在查看代码的正确版本的最简洁方法,并且将代码保存在git repo中是保留{{1 ID的含义,git没有做任何事情会改变COMMIT
ID的含义。完成和完成,没有必要"断开"在任何意义上的话。