2010-09-22 39 views
6

由於確定指導aptly points out(搜索「標籤和克隆」):如何在使用mercurial克隆或拉出標籤後獲取標籤更改集?

當您運行hg clone -r foo克隆庫作爲標籤foo,新 克隆將不包含任何版本比一個較新的標籤指的是 ,包括創建標籤的版本。其結果是,您將在 存儲庫中獲得項目歷史記錄的正確子集 ,但不是您可能預期的標記

這意味着hg tags在您的新克隆中不顯示foo標記。如果在添加foo標記之前進行了克隆,並且您做了hg pull -r foo,則會發生同樣的情況。我知道把它放入變更集中有很多優點(比如合併),但是它總讓人覺得奇怪的是元數據與源代碼混合在一起代碼)。

很明顯,我要求一種自動化的方式,而不是將標籤變更集作爲單獨的手動步驟。

我知道我可以在incoming鉤檢查這個場景(所以它同時適用於克隆和拉),或包裹clonepull

但是有沒有更好/更簡單的方法?


更新hg bug跟蹤器已經有this issue

+2

標籤介紹changesets已成爲我真正不喜歡Mercurial的幾件事之一 – 2010-09-22 17:08:41

回答

0

是的,它可以通過後克隆/拉鉤完成,但有一些騙子。

首先,它只適用於本地回購,因爲您無法獲得遠程回購中的標籤列表。

其次,處理克隆/拉參數和選項不是微不足道的。 (對於克隆我需要獲得目標回購,-r,-u,-U。對於拉我需要-r-u。)我試圖使用fancyopts,但它不能處理全局選項,這是在派遣處理。我設法破解派遣,只給了我一個命令的參數和選擇,但感覺和看起來很難看。

使用命令包裝將消除第二個問題。

我希望有一天hg會添加一個選項來克隆並拉動乾淨地完成它。

+1

如果你使用的是鉤子,你不能檢查'$ HG_URL'變量的值。 – 2011-01-25 22:58:44

+0

我也需要pats和opts,但是你提到的$ HG_URL幫助我從[man hgrc](http://www.selenic.com/mercurial/hgrc.5.html#hooks)發現所有的pre/post鉤子獲得$ HG_PATS和$ HG_OPTS。 – 2011-01-26 05:07:37

1

有一個postclone鉤子。它被稱爲post-clone(hgrc聯機幫助頁顯示post-ANYCOMMANDpre-ANYCOMMAND存在),不過正如您所指出的那樣,您也可以使用*changegroupupdate掛鉤,因爲克隆使用這兩種功能(除非您用-U禁止更新)。

如果只需要添加--localtag,那麼您只需要名稱,而不需要額外的變更集,只需要參考即可。像

hg clone -r tagname URL 
hg tag --local tagname 

你可以很容易地建立一個shell別名。

除此之外,不一定有保證是修訂版本X和修訂版本X被標記的修訂版本,而不需要修改其他修訂版本,因爲標記可能在其他工作完成後應用。當然,您可以隨時更新爲'X',並在您的工作目錄中擁有隨後的變更集,但他們仍然會在您的回購站中。

說實話,一旦我發現標籤名稱在標籤克隆時並沒有很長的時間,我承認最初讓我感到困惑,我沒有發現任何需要攜帶帶有標籤的變更集。

+0

感謝您的克隆後鉤。我刪除了「,因爲這個問題沒有'postclone'鉤子。我不太喜歡本地標籤,因爲我肯定會在一段時間後拉入標籤變更集。也沒有標籤變更集,我可以自己提交一個標籤,然後我必須合併標籤。 – 2010-09-22 15:56:11

+0

是的,這不是完美的,但沒有辦法做到這一點,無需拉動您可能還不想要的額外變更集(工作和標記集之間的所有變更集)。至少標籤無縫合並,本地不能衝突或被推送。 – 2010-09-22 16:27:23

+0

如果它是標記的唯一孩子,我只會拉動標記更改集。 @ Richard的回答給了我一個想法,即使用預克隆和預拉鉤來檢查案例並將克隆/拉出版本更改爲標籤變更集。將回傳。 – 2010-09-22 19:02:56

3

你想要一個帶有bash的嵌入式Perl腳本嗎?那麼,這是...

#!/bin/bash 
if [[ "$1" == "" || "$2" == "" || "$3" == "" ]]; then 
    echo 'hgclonetag <src> <tgt> <tag>' 
    exit 1; 
fi 

REV=`hg log -R $1 --rev $3: --limit=2 | perl -F: -lane 'if (/:([\dA-Fa-f]+)$/) {print $F[2] if defined($flag);$flag=1;}'` 
hg clone --rev $REV $1 $2 

這將調用hg log命令到第一標籤相關的修訂,然後克隆提取修訂號之後這個修訂版本。

目前這不適用於遠程回購:-R交換機不幸只能在本地回購。

+3

如果你沒有明確包含像「巨人」,「黑客」(哎呀,我剛剛冒犯了萊納斯勳爵?*遠程雷霆收集... *),「bash」和「perl」 的。我希望有一個小巧,優雅,基於hg的python解決方案:)不過。 – 2010-09-22 16:41:13

+1

使用'os.system'和一些正則表達式匹配來簡化Pythonize應該很簡單。好評:+1你自己! – 2010-09-22 16:50:24

+2

這不會工作,當你標記一箇舊版本...如果我做'hg標籤-r 100 foo',那麼我可能會創建修訂版本1000.所以提取版本101不會帶入標籤。 – 2010-09-30 15:48:34

3

我越去想它更多的我相信了答案是隻克隆一切,更新代碼,它可以在一個單一的步驟來完成:

hg clone http://host/path#tagname 

這會激發你的一切,然後hg update標記名將你的工作目錄設置爲正確的修訂版本。給定的增量壓縮不一定要大得多,如果是的話,您可以自動克隆其以前的本地克隆的大部分。

+0

謝謝,我不知道我也可以使用#。然而問題是,正如我的問題所述,在克隆中沒有標記變更集,所以我不知道克隆是哪個標記。 – 2011-01-26 04:53:38

+0

咦?看起來你知道這個名字,那個名字是'foo'。所以你可以做'hg clone http:// host/path#foo'。如果你真的不知道標籤的名字,你應該克隆一切,然後更新 - 在你的回購中有額外的轉換沒有壞處,但不是你的工作目錄。 – 2011-01-26 15:07:46

+0

對不起,我的意思是「**克隆所在的標籤**」,因爲克隆沒有'foo'標籤變更集。當然,我知道在克隆之後,但是不會過一會兒(我有可怕的短期記憶)。正如你所說,做一個完整的克隆然後更新是一個明顯的解決方案,而且我總是這樣做。只是'克隆父#foo'語義感覺有點奇怪,沒有得到標籤變更集。 – 2011-01-27 15:18:05