2015-11-04 33 views
1

標籤圖形的歷史不是線性的。人們不只是標記基線(master)。什麼是Git分支過去最近的標籤?

例如大多數有價值的JS/CSS庫從基線執行分支上的發佈以保持清晰的差異歷史記錄。他們提交釋放工件(編譯/縮小的JS/CSS),以便用戶可以輕鬆抓取工件而無需構建。如果他們在master上標記,則master歷史記錄將對構建工件產生巨大的全部差異。

真實的例子:從How to get the latest tag name in current branch in Git?

bash# cd js/jquery 
/home/user/devel/js/jquery 

bash# git remote -v 
origin https://github.com/jquery/jquery.git (fetch) 

bash# git co master 
Already on 'master' 

bash# git describe --tags 
2.1.0-beta1-590-g47ccf3d 

bash# git log --graph --decorate --simplify-by-decoration --oneline --all 
* 70605c8 (origin/master, origin/HEAD) Ajax: Only form-encode requests with a body 
* 47ccf3d (HEAD -> master) Attributes: do not set properties to false when removing booleans 
| * 8339185 (origin/compat) Tests: Make regexes for iOS devices more rigid 
| | * f9846ae (tag: 3.0.0-alpha1) 3.0.0-alpha1 
| |/ 
|/| 
... 
* | 1185427 (tag: 2.1.0-beta1) Tagging the 2.1.0-beta1 release. 

技巧是在現實世界中沒用,因爲:

git describe --tags 

我得到2.1.0-β1在上面的例子中,但最近的努力是3.0.0-alpha1

我公司目前已經從手動審查collapsed commit history的最佳方式:

git log --graph --decorate --simplify-by-decoration --oneline --all 
+1

來自@ydroneaud的[答案](http://stackoverflow.com/a/24830212/1027800)有一個按時間順序打印標籤的命令......這不正是你想要的嗎?我認爲按時間順序是理想的指標,因爲這些標籤不一定具有共同的歷史。 – hinerm

+0

@hinerm項目可能會支持舊分支機構。至於jQuery的例子,你可能會在2.1.4之前的版本中看到v1.11.3,而不尊重歷史DAG。 – gavenkoa

回答

1

挖的Git文檔後,我設法寫:

$ git tag \ 
    | while read t; do \ 
     b=`git merge-base HEAD $t`; \ 
     echo `git log -n 1 $b --format=%ai` $t; \ 
     done | sort 
... 
2014-04-18 17:17:51 -0400 2.1.1-rc2 
2014-04-30 10:43:39 -0400 2.1.1 
2014-05-18 20:47:37 +0400 2.1.2 
2014-05-18 20:47:37 +0400 2.1.3 
2014-05-18 20:47:37 +0400 2.1.4 
2015-07-13 15:01:33 -0400 3.0.0-alpha1 

正如我充滿自信與汞我做出了相應的解決方案:

$ hg convert \ 
    $(git -C jquery/ rev-parse --branches --remotes --tags \ 
     | sed 's=.*=--rev &=') \ 
    jquery/ jquery-hg/ 

$ cd jquery-hg 
$ hg up -r master 

$ hg log -r 'tag()' --template '{node} {tags}\n' \ 
    | while read r t; do \ 
     hg log -r "ancestor($r,.)" --template "{date|isodate} {node} $t \n"; \ 
     done | sort 

2014-06-16 03:08 +0400 f6f4d6eb708a33f714a2e0003cb7087762407348 2.1.2 
2014-06-16 03:08 +0400 f6f4d6eb708a33f714a2e0003cb7087762407348 2.1.3 
2014-06-16 03:08 +0400 f6f4d6eb708a33f714a2e0003cb7087762407348 2.1.4 
2015-07-13 15:01 -0400 4abe7e961f0e5eb0e75f03030a80a128553f34c1 3.0.0-alpha1 

我可以添加別名到~/.bashrc,這段代碼在jQuery/Hibernate/Lunix/Spring源代碼上需要4秒的時間,但是一些奇怪的填充不會離開我。是否有單線解決方案?

UPDATEhttps://stackoverflow.com/a/34239190/173149這裏寫了一個很長的回答是基本部分:

由於Git使用DAG,而不是線性的歷史 - 這是很難定義距離度量所以我們可以說 - 噢,那REV是離我最近的HEAD

標籤和修訂之間的距離的一些合理的定義是:最短

長度
  • 路徑HEAD合併基礎與標籤(不知道是誰用git指令計算)
  • 日期合併基地HEAD和標記之間
  • 數轉速的可達的,從頭部,但是從標籤不可達(見下面的腳本)

腳本之類的標籤,根據數轉速的可達的,從頭部,但是從標籤不可達:

$ git tag \ 
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \ 
    | sort -n 

如果您的項目歷史記錄在提交時有奇怪的日期(由於重新編號或其他歷史重寫或某些白癡忘記更換BIOS電池或您在歷史記錄中執行的其他魔術),請使用該腳本。

+0

git for-each-ref更適合遍歷圖並選擇提交或標籤。 https://git-scm.com/docs/git-for-each-ref –