我有一个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",
我希望在一段时间内对此特定文件进行更改。
答案 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 master
。 git reflog
命令还具有用于处理日志的其他各种子命令。有关详细信息,请参见its documentation。
1 名称确实具有其他功能。有关更多信息,请参见Think Like (a) Git。
2 假定它不是 shallow 克隆,即不使用某些尚未普遍使用的新“承诺包”功能。另外,如果您使用-b
或--single-branch
进行克隆,或者上游存储库以不太常见的方式设置,则可能根本没有名为master
的分支。>