簡體   English   中英

git差異在git克隆后無法正常工作

[英]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引用隨時間的變化。

這可能會讓您對refreference究竟是什么感到困惑。 我們可能不應該在這里對 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM