[英]git difference does not work properly after git clone
我有一个 bash 脚本,我必须在其中克隆并获取一些存储库的差异。 我正在尝试获取日期范围之间的差异
git clone $repository
cd $path
git diff master@{2019-10-1}..master@{2019-10-14} -- package.json
但它显示错误:警告:'master' 的日志仅返回 2019 年 10 月 15 日星期二 09:51:16 +0000。
但是这个存储库很旧并且有很多提交。 当我在几周前克隆相同存储库的机器上本地执行此操作时,我得到了适当的区别。
$ git diff master@{2019-10-1}..master@{2019-10-14} -- package.json
diff --git a/package.json b/package.json
index d29ffcb..8766fde 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "accountd",
- "version": "0.0.95",
+ "version": "0.0.102",
"main": "dist/src/index.js",
"private": true,
"scripts": {
@@ -8,7 +8,8 @@
"start-dev": "npm run build && nodemon . port=5000 stage",
"start-sand": "npm run build && nodemon . port=5000 stage",
- "test": "nyc --extension .ts --reporter=html --reporter=cobertura --reporter=text mocha -r ts-node/register src/**/*.spec.ts --exit",
+ "test": "mocha -r ts-node/register test/**/*.spec.ts test/**/**/*.spec.ts --exit",
我希望在一段时间内对此特定文件所做的更改。
您使用的符号( master@{<date>}
)表示您想根据本地 reflogs 引用<date>
上的master
版本。 也就是说,您是说您想知道该特定克隆的master
引用在该日期指向的内容 - 而不是在该日期提交的当前master
提交中的哪些内容。
git 告诉你“这个克隆在那个日期没有master
参考”。
要做到你的意思,你首先必须找到“当时”日期之前的最后一次提交,然后对此进行diff
。有很多方法,但类似
git diff $(git rev-list -n1 --before="<date>" --first-parent master) master
可能是你想要的更多
@{date}
语法不会得到你想要的。 我会 go 变成你想要的,但我被打败了; 请参阅Mark Adelsberger 的答案。 :-)
@{...}
语法的知识使用@{date}
语法,存储库源的年龄无关紧要。 你有多少次提交并不重要。 重要的是这个特定克隆的所谓reflogs中的内容。
每个 Git 存储库(每个克隆)都有自己的引用日志。 一般来说,没有两个不同的 Git 存储库会就 reflog 中的内容达成一致。 reflogs 不适合这种工作。 什么样的工作? 这种:
我希望在一段时间内对此特定文件所做的更改。
随着时间的推移,reflogs 绝对不会告诉您有关文件更改或文件未更改的任何信息。 它们会告诉您 Git引用随时间的变化。
这可能会让您对ref或reference究竟是什么感到困惑。 我们可能不应该在这里对 go 进行太多详细说明,但是像master
这样的每个分支名称实际上都是一个参考,其完整拼写是refs/heads/master
; 每个像v1.2
这样的标签名称都是一个 ref,其完整拼写是refs/tags/v1.2
; 并且像origin/master
这样的每个远程跟踪名称都是一个 ref,其完整拼写以refs/remotes/
开头。 所以它们只是人类倾向于使用的各种名称的概括,用于谈论提交。 谈到提交, Git需要的是它们的原始 hash ID。 在某种程度上,这些名称只是为了让我们弱者不必记住任意、又大又丑的 hash ID。 1
理解这一点以及@{...}
语法的关键是要认识到这些名称——例如, refs/heads/master
会随着时间而改变。 现在,您的master
提交可能是a123456...
。 昨天,它可能是另一个提交,明天,它可能是另一个提交。 你的Git 的master
会随着时间的推移而改变,每次它确实改变时,你的Git 都会记录它是什么。 这条记录只能追溯到到目前为止:提交是永久的,但 hash ID master
的记录是什么时候,不是。 此外,它不会从一个克隆传送到另一个克隆:每个克隆记录的master
何时表示什么是该特定 Git 私有的。 在一个包含所有提交2的新克隆中,只有一个master
曾经拥有的值,这就是它现在拥有的值。
请注意,您也可以使用@{ number }
。 这将选择 reflog 中的第 number 个条目。
要查看任何特定 ref 的实际 reflog,请运行git reflog ref
,例如git reflog master
。 git reflog
命令还有其他各种处理日志的子命令。 有关详细信息,请参阅其文档。
1名称确实有其他功能。 有关这方面的更多信息,请参阅Think Like (a) Git 。
2假设它不是浅层克隆,也就是说,没有使用一些尚未普遍使用的新“promisor pack”功能。 此外,如果您使用-b
或--single-branch
进行克隆,或者上游存储库以不常见的方式设置,您可能根本没有名为master
的分支。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.