git克隆后git差异无法正常工作

时间:2019-10-15 12:26:14

标签: bash git

我有一个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",

我希望在一段时间内对此特定文件进行更改。

2 个答案:

答案 0 :(得分:4)

您使用的表示法(master@{<date>}表示您想参考master <date>的版本,具体取决于本地引用日志。也就是说,您要说的是想知道该特定克隆的master引用在该日期指向的内容,而不是当前master提交在该日期提交的内容。

然后git告诉您“此克隆在该日期没有master引用”。

要执行您的意思,您首先必须找到“ then”日期之前的最后一次提交,然后针对该日期diff。有多种方法,但是类似

git diff $(git rev-list -n1 --before="<date>" --first-parent master) master

可能是您想要的更多

答案 1 :(得分:0)

@{date}语法无法满足您的需求。我会按照您的要求去做,但是我被打败了。请参阅Mark Adelsberger's answer。 :-)

关于@{...}语法的了解

使用@{date}语法,存储库源的年龄并不重要。您有多少 commit 都没关系。重要的是这个特定克隆的所谓的 reflogs

每个Git存储库(每个克隆)都有自己的引用日志。一般而言,没有两个不同的Git存储库会同意reflog中的内容。 Reflog不适用于此类工作。什么样的工作? 这种类型:

  

我希望在一段时间内对此特定文件进行更改。

随着时间的推移,引用日志绝对不会告诉您有关文件更改或文件未更改的任何信息。他们会告诉您Git的引用随着时间的变化。

这可能会让您对 ref reference 的确切含义感到困惑。我们可能在这里不应该赘述,但是每个分支名称(例如master)实际上都是一个引用,其完整拼写为refs/heads/master;每个标签名称,例如v1.2都是参考,其完整拼写为refs/tags/v1.2;并且每个远程跟踪名称(例如origin/master都是参考,其完整拼写以refs/remotes/开头)。因此,它们只是人类用来谈论提交的各种名称的概括。要讨论提交, Git 需要的是其原始哈希ID。 名称在某种程度上就在那里,这样我们弱小的人就不必记住任意的,大的丑陋的哈希ID。 1

了解这一点和@{...}语法的关键是要认识到这些名称(例如refs/heads/master)随时间的变化。目前,您的master提交可能是a123456...。昨天,可能是其他提交,而明天,可能是另一个提交。 您的 Git的master会随着时间的推移而变化,并且每次它发生变化时,您的 Git都会记录它的。该记录仅可追溯到现在: commits 是永久性的,但是哪个哈希ID master意味着什么时候不是永久性记录。而且,它不是从一个克隆带到另一个克隆:每个克隆记录master的含义是何时专用于该特定Git 。在一个具有 all commits 2 的新克隆中,master仅有一个值,这就是现在的值。

请注意,您也可以使用@{number}。这将在引用日志中选择第th个条目。

要查看任何特定参考的实际参考日志,请运行git reflog ref,例如git reflog mastergit reflog命令还具有用于处理日志的其他各种子命令。有关详细信息,请参见its documentation


1 名称确实具有其他功能。有关更多信息,请参见Think Like (a) Git

2 假定它不是 shallow 克隆,即不使用某些尚未普遍使用的新“承诺包”功能。另外,如果您使用-b--single-branch进行克隆,或者上游存储库以不太常见的方式设置,则可能根本没有名为master的分支。